文章插图
图片来源于网络
- spring bean 生命周期 (Bean 解析和注册)
实例化 -> 属性赋值 -> 初始化 -> 销毁
实例化 Instantiation
属性赋值 Populate
初始化 Initialization
销毁 Destruction
class
->构造器->反射创建对象
-> 依赖注入(@Autowired)
-> 初始化前(@PostConstruct)->初始化(InitializingBean)->初始化后(AOP)
-> 代理对象->bean
- spring bean生命周期代码入口 finishBeanFactoryInitialization(beanFactory)
//真正逻辑在 AbstractAutowireCapableBeanFactory.doCreateBean()finishBeanFactoryInitialization()DefaultListableBeanFactory#preInstantiateSingletons()getBean(beanName)AbstractBeanFactory.doGetBean()AbstractAutowireCapableBeanFactory#createBean()//1 Object bean = resolveBeforeInstantiation(beanName, mbdToUse); //2 对象实例化 AbstractAutowireCapableBeanFactory.doCreateBean() Object beanInstance = doCreateBean(beanName, mbdToUse, args);BeanWrapper instanceWrapper = null;//doCreateBean-1 通过反射创建对象实例 (调用构造器创建对象)instanceWrapper = createBeanInstance(beanName, mbd, args);//doCreateBean-2 给后置BDpost-processors 一个修改 BeanDefinition的机会applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);//doCreateBean-3 通过提前暴露一个单例工厂方法,从而使得其他 bean 能够引用到该 bean (解决单例 bean循环依赖)addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));//doCreateBean-4 DI 依赖注入 (对象属性初始化,各个属性值注入,其中可能注入其他 bean 的属性,这时候会递归初始化依赖 bean)populateBean(beanName, mbd, instanceWrapper);//doCreateBean-5 调用初始化方法,比如 init-methodexposedObject = initializeBean(beanName, exposedObject, mbd);//initializeBean-1 调用 Aware接口实现类invokeAwareMethods(beanName, bean);//initializeBean-2 bean前置处理 beanProcessor.postProcessBeforeInitialization();wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);//initializeBean-3 调用初始化方法((InitializingBean) bean).afterPropertiesSet();invokeInitMethods(beanName, wrappedBean, mbd);//initializeBean-4 bean后置处理 beanProcessor.postProcessAfterInitialization()wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);return exposedObject;//3return beanInstance;//然后回到AbstractBeanFactory.doGetBean(),执行getSingleton(),注册 bean到容器sharedInstance = getSingleton(beanName, () -> {//todo2.2 创建 单实例bean (ctrl+T)return createBean(beanName, mbd, args);}
- spring bean 生命周期核心代码逻辑
// AbstractBeanFactory.doGetBean()protected <T> T doGetBean(final String name, ...) {// 1 提取对应的 beanName (传入的 name 可能是别名,FactoryBean(name="&aa"))final String beanName = transformedBeanName(name);Object bean;// 2 尝试直接从缓存获取,或者singletonFactories 中的 objectFactory中获取Object sharedInstance = getSingleton(beanName);if (sharedInstance != null && args == null) {//该条件一般为二次获取 bean 才会进入}else {//lambda 方式调用 DefaultSingletonBeanRegistry.getSingleton(beanName, ObjectFactory<?>)//获取createBean()创建的bean对象后,走getSingleton()逻辑添加bean 到bean容器(DefaultSingletonBeanRegistry.singletonObjectssharedInstance = getSingleton(beanName, () -> {//todo2.2 调用createBean()方法创建对象return createBean(beanName, mbd, args);}bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}}//...return (T) bean;}//AbstractAutowireCapableBeanFactory.doCreateBean()//spring bean 生命周期核心代码逻辑 (bean 实例化,依赖注入,以及初始化)protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args){// Instantiate the bean. (装饰模式)BeanWrapper instanceWrapper = null;if (instanceWrapper == null) {//todo 1 根据指定的 bean 使用对应的策略来创建 bean,如:工厂方法,构造函数注入,简单初始化instanceWrapper = createBeanInstance(beanName, mbd, args);}// Initialize the bean instance.try {//todo 2 DI 依赖注入 (对象属性初始化,各个属性值注入,其中可能注入其他 bean 的属性,这时候会递归初始化依赖 bean)populateBean(beanName, mbd, instanceWrapper);//todo 3 调用初始化方法,比如 init-methodexposedObject = initializeBean(beanName, exposedObject, mbd);}// ...Register bean as disposable.return exposedObject;}
Bean生命周期-常用扩展点- 第一大类:容器级生命周期接口方法(影响多个Bean的接口)
容器级生命周期接口方法:包含了
InstantiationAwareBeanPostProcessor和BeanProcessor这两个接口实现,称他们的实现类为“后处理器” 。
推荐阅读
- DNS解析过程原理!
- PVLAN全面解析 一个VLAN之中如何实现端口之间隔离?
- 详细解析 沈阳初中
- 新加坡|新加坡家族办公室移民解析
- 乐高积木原来这么神奇?解析乐高积木与自闭症 神奇的积木
- 四年级上语文期末试卷及解析 四年级上册语文期末试卷
- 必修一数学题50道及解析 高中数学必修一测试题
- 小米12|小米12T系列入网:2亿像素加持 解析力强于12S Ultra
- 同位语从句热门考点解析 同位语从句讲解
- curly解析 curly是什么意思