Bootstrap

Spring中的IOC Bean管理

Bean多实例与单实例

  • Spring默认为单实例对象(验证:多次获取,输出地址相同)
  • 可以通过设置改成多实例对象:
    1,在bean中加入scope=“prototype”(默认为singleton)
    2,sington和prototype区别:
    (1)设置单实例、多实例。
    (2)singleton在加载配置文件时候就会创建单实例对象,prototype在加载配置文件时候不创建对象,在调用getBean方法时候创建多实例对象。
  • 也可设置为request或者session,表示一次请求和一次对话(session),把对象放在一次请求中或者一次对话中(session)

Bean生命周期:
Spring 加载xml时会将xml中的bean对象都创建。

(1)通过构造器创建bean实例(无参构造)
(2)为bean的属性设置值和其他bean的引用(set方法)
(2.5)前置处理,在初始化之前执行,需要实现BeanPostProcessor接口(前后置处理都需要配置bean,同时被被配置的xml中所有的bean对象都会执行前后置处理)
(3)调用bean的初始化方法(需要进行配置初始化方法)
(3.5)前置处理,在初始化之后执行,需要实现BeanPostProcessor接口
(4)bean创建完成可以使用了
(5)调用bean销毁方法(需要进行配置初销毁方法,销毁需要手动调用)

测试代码:
java类:

public class TestBeanLife {
    private String testSet;

    public TestBeanLife() {
        System.out.println("第一步:调用无参构造创建实例");
    }

    public void setTestSet(String testSet) {
        this.testSet = testSet;
        System.out.println("第二步:通过set方法传入参数");
    }
    public void initMethod(){
        System.out.println("第三步:调用初始化方法");
    }
    public void destroyMethod(){
        System.out.println("第五步:调用销毁方法");

    }
}

xml配置:

<bean id="TestBeanLife" class="com.BeanLife.TestBeanLife" init-method="initMethod" destroy-method="destroyMethod">
        <property name="testSet" value="测试set在生命周期中的执行"></property>
</bean>

测试:

	
	@Test
    public void testBeanLife(){
        ApplicationContext context = new ClassPathXmlApplicationContext("beanLife.xml");
        TestBeanLife testBeanLife = context.getBean("TestBeanLife", TestBeanLife.class);
        System.out.println("第四步:bean创建完成可以使用了" +
                "");
        System.out.println(testBeanLife);
		// 强制转换为ClassPathXmlApplicationContext,然后销毁。因为close是ClassPathXmlApplicationContext的方法
        ((ClassPathXmlApplicationContext)context).close();
    }
;