springbean的生命周期
产生-》使用-》销毁

1:springboot容器启动
2:通过loadBeanDefinitions将xm和注解定义的bean加载到beanDefinitionMap集合中
3:循环beanDefinitionMap集合调用createBean方法创建对象
3.1:构造对象
通过createBeanInstance方法进行对象的构造, 先用反射机制从“Bean定义”中的BeanC拉屎拿到这个类的构造方法。
获取构造方法的规则:
1、首先拿取@AutoWired注解的构造方法,如果存在多个无法识别报错;
2、使用无参构造方法;
3:使用有参构造方法,如果存在多个无法识别报错;
3.2:填充属性
使用populateBean从单例池中为@AutoWired注解的属性赋值;
3.3:初始化实例
initializeBean方法对实例初始化;
1:初始化容器相关信息
通过invokeAwareMethods方法为实现了各种Aware接口的bean设置beanName、beanFactory等容器信息;(Aware的接口代表信息感知接口,实现了这些接口就可以在bean实例中感知并获取到对应的信息)
1.2:通过invokeInitMethods方法执行Bean的初始化方法,也就是实现了InitializingBean接口的afterPropertiesSet()方法;
然后继续执行自定义的initMethod方法
1.3:在执行invokeInitMethods前后还需要对Bean后置处理器BeanPostProcessor处理
在invokeInitMethods之前调用postProcessBeforeInitialization方法,执行之后调用postProcessAfterInitialization,处理各自Bean的后置处理器;
这些处理器包括容器自身提供的负责aop处理的AnnotationAwareAspectJAutoProxyCreator、负责构造后@PostConstruct和销毁前@PreDestroy处理的InitDestroyAnnotationBeanPostProcessor等系统处理器,以及自定义的Bean通过实现BeanPostProcessor的处理器等等;
这些处理器可以通过实现PriorityOrdered接口来指定顺序
3.4:注册销毁
通过registerDisposableBean方法,将实现了DisposableBean接口的Bean进行注册这样在销毁时就会执行destroy方法
4:保存对象
将这些完整的Bean对象通过addSingleton方法放入单例池singletonObjecs中就可以被获取和使用了
样例代码:
package com.doudou.mall.service.impl; import com.doudou.mall.service.IOrderService; import org.springframework.beans.BeansException; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; @Service public class OrderServiceImpl implements IOrderService, InitializingBean, DisposableBean, ApplicationContextAware,BeanPostProcessor { /** * InitializingBean * * @throws Exception */ @Override public void afterPropertiesSet() throws Exception { System.out.println("顺序3"); } @Override public void destroy() throws Exception { System.out.println(); } @PostConstruct public void test() throws Exception { System.out.println("顺序2"); } /** * ApplicationContextAware * * @param applicationContext * @throws BeansException */ @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("顺序1"); } /** * BeanPostProcessor * * @param bean * @param beanName * @return * @throws BeansException */ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("顺序4"); return bean; } /** * BeanPostProcessor * * @param bean * @param beanName * @return * @throws BeansException */ @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("顺序5"); return bean; } }

浙公网安备 33010602011771号