Bean的生命周期
导图放前面,方便记忆
Bean的生命周期
生产
loadBeanDefinitions加载BD
createBean创建Bean
构造对象
createBeanInstall()通过反射构造对象
构造方法选择:
-
单个构造方法-->该方法
-
多个构造方法-->优先@Autowired
-
优先无参构造方法
构造参数选择:
- 先通过Class类型查找,多个实例,再通过参数名字查找
填充属性
populateBean(),通过三级缓存方法。sigletonObjects、singletonFactories、earilySigletonObjects
初始化实例
initialzeBean()
-
invokeAwareMethods()调用各个Aware接口的实现方法
-
postProcessBeforeInitialization() 初始化前调用bean后置处理器这个方法
-
invokeInitMethods()调用实现InitializingBean的afterPropertiesSet()方法
-
执行指定的initMethod()
-
postProcessAfterInitialization() 初始化后调用bean后置处理器这个方法,代理等就是通过这个实现的。
注册销毁
registerDisposableBean()将实现DisposableBean接口的bean进行注册
添加单例池
addSingleton()将生产好的bean添加到单例池
使用
销毁
-
DisposableBean接口的-->destory()
-
@PreDestory
-
自定义的destoryMethod()
代码验证
@Configurable
@ComponentScan("com.daniel.*")
public class Main {
/*@Bean(initMethod = "initSelf",destroyMethod = "destroySelf")
public User user(){
return new User();
}*/
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Main.class);
User user = (User) applicationContext.getBean("user");
user.work();
System.out.println("====我要销毁容器了====");
applicationContext.close();
}
}
为了验证initMethod、@PostConstruct、afterPropertiesSet增加的
@Component
public class User implements BeanNameAware, BeanFactoryAware , InitializingBean {
private Integer id;
private String name;
private String sex;
@Autowired
private Address address;
public User() {
System.out.println("1.User构造方法创建User");
}
@PostConstruct
public void afterConstruct(){
System.out.println("4.1.看我注解@PostConstruct:我是在构造方法后执行的");
}
@PreDestroy
public void preDestroy(){
System.out.println("6.2.看我注解@PreDestroy:我要开始销毁bean了" );
}
@Override
public void setBeanName(String s) {
System.out.println("3.1.Aware接口BeanName执行了");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("3.2.Aware接口BeanFactory执行了");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("4.2. InitializingBean接口的afterPropertiesSet执行了");
}
public void initSelf(){
System.out.println("4.3.我自定义的initMethod方法执行了");
}
public void destroySelf(){
System.out.println("6.3.我自定义的destroy方法执行了");
}
public void work(){
System.out.println("5.我可以工作了...");
}
}
@Component
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class Address {
private String city;
public Address() {
System.out.println("2.Address出生了,要给User填充属性");
}
}
这里我为了控制台顺序显性打印出来填充属性的步骤,所以设置为原型了,如果是默认单例的话,环境启动的时候,Address要先User提前构建完成,User步骤中填充属性功能就不显示了
@Component
public class MyBeanDisposable implements DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("6.1. DisposableBean接口中的destroy方法执行了");
}
}
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("Bean生产前后处理器.我是postProcessBeforeInitialization...." + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("Bean生产前后处理器.我是postProcessAfterInitialization...." + beanName);
return bean;
}
}
控制台最后打印出的消息
1.User构造方法创建User
2.Address出生了,要给User填充属性
Bean生产前后处理器.我是postProcessBeforeInitialization....address
Bean生产前后处理器.我是postProcessAfterInitialization....address
3.1.Aware接口BeanName执行了
3.2.Aware接口BeanFactory执行了
Bean生产前后处理器.我是postProcessBeforeInitialization....user
4.1.看我注解@PostConstruct:我是在构造方法后执行的
4.2. InitializingBean接口的afterPropertiesSet执行了
Bean生产前后处理器.我是postProcessAfterInitialization....user
14:54:05.658 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'myBeanDisposable'
Bean生产前后处理器.我是postProcessBeforeInitialization....myBeanDisposable
Bean生产前后处理器.我是postProcessAfterInitialization....myBeanDisposable
5.我可以工作了...
我要销毁容器了
6.1. DisposableBean接口中的destroy方法执行了
6.2.看我注解@PreDestroy:我要开始销毁bean了