1.通过BeanFactory或者ApplicationContext获取实例Bean
2.set属性注入
3.如果Bean实现BeanNameAware接口,则调用setBeanName(String name)方法设置Bean的name属性
4.如果Bean实现BeanFactoryAware接口,则调用setBeanFactory(BeanFactory beanFactory)方法,设置创建该Bean的工厂
5.如果有定义BeanPostProcessor接口,则调用该接口的postProcessBeforeInitialization(Object bean, String beanName)方法
该方法可以对Bean实例进行额外的增加处理操作。可以是全局针对所有Bean进行统一处理,ApplicationContext初始化时会自动找到实现该接口的类进行所有Bean的增强处理。
6.如果Bean实现了InitializingBean接口,且该接口有 @PostConstruct修饰的方法,则执行该方法(该注解方法是在BeanPostProcessor的postProcessBeforeInitialization中执行的),然后执行afterPropertiesSet()方法;
该方法没有参数,不能对该Bean进行处理,可以增加比如日志、读取配置文件之类的操作。
7.如果Bean自定义了init-method指定的方法,则调用该方法
8.接着调用BeanPostProcessor接口的postProcessAfterInitialization(Object bean, String beanName)方法
9.如果Bean实现了DisposableBean接口,则调用该接口的destory()方法。同InitializingBean类似,该接口如果有指定@PreDestory注解修饰的方法,也会先调用该方法。
10.如果Bean指定了destory-method方法,则执行该方法
以上为Bean生命周期顺序。
说明:
1.afterPropertiesSet()和init-method有什么区别
afterPropertiesSet()依赖InitializingBean接口实现,Bean定义时必须实现该接口才能使用,对代码有一定的侵入。init-method只需要指明要调用哪个方法就可以了。同理DiaposableBean的destory()方法和destory-method。
但是afterPropertiesSet()执行效率比init-method指定的方法高,该方法是直接调用执行,而init-method指定的方法需要通过反射调用。
init-method和destory-method指定的方法必须是一个无参的方法,否则,初始化会报错。