一、单例管理的对象
spring创建的对象,默认都是单例模式。以BeanC为示例,创建对象过程中一些方法的调用属顺序如下:
@Setter
@Getter
public class BeanC implements InitializingBean {
public BeanC() {
System.out.println("BeanC construct()");
}
public void init() {
System.out.println("BeanC init()");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("BeanC afterPropertiesSet()");
}
}
##################################################################################
@Configuration
public class BeanConfiguration {
@Bean(initMethod = "init")
public BeanC beanC() {
return new BeanC();
}
}
打印结果(对类进行加载的时候就打印了):
BeanC construct()
BeanC afterPropertiesSet()
BeanC init()
1.会在加载Bean的时候就去创建bean
2.首先会调用类的construct
3.如果实现了InitializingBean接口,则会去调用afterPropertiesSet()方法
4.调用initMethod指定的init()方法
二、单例管理的对象
Spring创建的对象,如果想要创建的bean是原型模式,则需要通过设置scop=prototype,SpringBoo设置方式为:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Setter
@Getter
public class BeanAA implements InitializingBean, DisposableBean {
private String name;
public BeanAA() {
System.out.println("beanAA construct()");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("beanAA afterPropertiesSet()");
}
@Override
public void destroy() throws Exception {
System.out.println("beanAA destroy()");
}
}
##################################################################################
@Configuration
public class BeanConfiguration {
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public BeanAA beanAA() {
BeanAA beanAA = new BeanAA();
beanAA.setName("beanAA");
return beanAA;
}
}
三、测试获取bean
BeanC beanC1 = ApplicationContextUtil.getBean("beanC", BeanC.class);
System.out.println("get beanC:" + beanC1);
BeanC beanC2 = ApplicationContextUtil.getBean("beanC", BeanC.class);
System.out.println("get beanC:" + beanC2);
BeanAA beanAA1 = ApplicationContextUtil.getBean("beanAA", BeanAA.class);
System.out.println("get beanAA:" + beanAA1);
BeanAA beanAA2 = ApplicationContextUtil.getBean("beanAA", BeanAA.class);
System.out.println("get beanAA:" + beanAA2);
打印结果:
get beanC:indi.cheng.springboot.bean.BeanC@7c80fd7a
get beanC:indi.cheng.springboot.bean.BeanC@7c80fd7a
beanAA construct()
beanAA afterPropertiesSet()
get beanAA:indi.cheng.springboot.bean.BeanAA@36457c88
beanAA construct()
beanAA afterPropertiesSet()
get beanAA:indi.cheng.springboot.bean.BeanAA@6b282faf
对于原型(prototype)模式的bean,spring创建其对象时,一些初始化方法的调用顺序和单例模式是一样的,但是原型模式下,只有bean在被调用的时候,才会去初始化bean,由上面打印结果可知,单例模式获取的是同一个对象,而原型模式获取的是两个不同的对象。