bean的装载顺序:
0.获取bean的定义
1.createBean 创建bean的实例
2.populateBean 对bean的属性赋值
3.initializeBean.初始化bean
3.1invokeAwareMethods 处理AWARE接口方法的回调
3.2 applyBeanPostProcessorsBeforeInitialization应用后置处理器
3.3 invokeinitMethods 执行自定义的初始化方法
3.4 applyBeanPostProcessorsAfterInitialization bean初始化后执行后置处理的方法
4.bean创建成功
5.bean注册到beanFactory中
看个具体事例理解bean声明周期
package day02bean;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
Dog构造方法
bean实现了BeanNameAware接口,就调用回调方法
bean实现了BeanFactoryAware接口,就调用回调方法
bean实现了ApplicationContextAware接口,就调用回调方法
调用BeanPostProcessor的初始化预处理方法postProcessBeforeInitialization方法
@PostConstruct 标注的方法
bean 实现了 InitializingBean 就调用 afterPropertiesSet 方法
bean被定义的时候自定义的初始化方法
调用BeanPostProcessor的初始化后置处理方法postProcessAfterInitialization方法
bean可以被使用了
容器关闭后的方法
@PreDestroy 标记的销毁方法
DisposableBean 的销毁方法
bean被定义的时候自定义的销毁方法
*/
public class Dog implements InitializingBean,DisposableBean,BeanNameAware,BeanFactoryAware,ApplicationContextAware {
@Override
public void destroy() throws Exception {
System.out.println("----DisposableBean -destroy-------");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("---InitializingBean--afterPropertiesSet-------");
}
public Dog() {
System.out.println("---Dog----");
}
public void init() {
System.out.println("-----Dog init----");
}
public void destory() {
System.out.println("-----Dog destory----");
}
public void hello(){
System.out.println("------Dog hello-----");
}
@PostConstruct
public void PostConstruct() {
System.out.println("------Dog PostConstruct-----");
}
@PreDestroy
public void PreDestroy() {
System.out.println("------Dog PreDestroy-----");
}
@Override
public void setBeanName(String name) {
System.out.println("-----BeanNameAware----");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("----BeanFactoryAware---");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
System.out.println("------ApplicationContextAware---");
}
}
执行结果和分析如下:
---Dog----
-----BeanNameAware----
----BeanFactoryAware---
------ApplicationContextAware---
---MyBeanPostProcesor --postProcessBeforeInitialization-----Dog
------Dog PostConstruct-----
-----afterPropertiesSet-------
-----Dog init----
---MyBeanPostProcesor --postProcessAfterInitialization-----Dog
------Dog hello-----
七月 25, 2018 6:18:41 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@1d56ce6a: startup date [Wed Jul 25 18:18:41 CST 2018]; root of context hierarchy
------Dog PreDestroy-----
-----destroy-------
-----Dog destory----
分析:
---Dog---- bean的构造方法
--属性赋值----
-----BeanNameAware---- 如果实现了BeanNameAware接口,调用他的方法
----BeanFactoryAware--- 如果实现了BeanFactoryAware接口,调用他的方法
------ApplicationContextAware--- 如果实现了ApplicationContextAware接口,调用他的方法
---MyBeanPostProcesor --postProcessBeforeInitialization-----Dog----- BeanPostProcesor的预处理初始化方法
------Dog PostConstruct----- @PostConstruct注解标记的方法
-----afterPropertiesSet------- 如果bean实现了 InitializingBean接口就调用 afterPropertiesSet 方法
-----Dog init---- bean定义的时候自定义的初始化方法
---MyBeanPostProcesor --postProcessAfterInitialization-----Dog
------Dog hello----- bean可以被使用了
七月 25, 2018 6:18:41 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@1d56ce6a: startup date [Wed Jul 25 18:18:41 CST 2018]; root of context hierarchy
------Dog PreDestroy----- @PreDestroy注解标记的方法
-----destroy------- 如果bean实现了 DisposableBean接口就调用 afterPropertiesSet 方法
-----Dog destory---- bean定义的时候自定义的销毁方法