Bean的生命周期
2022-01-05 21:18:17 4 举报
此图是我对SpringIoC源码的理解,供大家学习交流
作者其他创作
大纲/内容
第6次调用后置处理器@Autowired 属性注入逻辑
缓存中没有,调用业务factoryBean.getObject()生成的bean
!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()
创建bean
缓存单例bean到单例对象池
beforeSingletonCreation(beanName)
createAopProxy()代理方式的选择
singletonObject = singletonFactory.getObject()
object = getCachedObjectForFactoryBean(beanName)
DisposableBeanAdapter#destroy
singleton
AbstractBeanFactory#getBean(String name)
容器启动
返回bean
第5次调用后置处理器, 在属性填充逻辑前调用,可以忽略属性填充
存在,判断FactoryBean类型
afterSingletonCreation(beanName)
setter方式反射完成依赖bean注入
从factoryBeanObjectCache缓存中返回bean
执行bean生命周期回调的init方法
finishBeanFactoryInitialization(beanFactory)
是否是FactoryBean类型 name的前缀是否是&
destroySingleton(beanName)
通过构造方法自动注入创建bean实例 clazz.newInstance(constructors)
自定义初始化bean三种方式@PostConstruct 底层实现:InitDestroyAnnotationBeanPostProcessor#postProcessBeforeInitialization实现InitializingBean接口afterPropertiesSet()方法@Bean(initMethod=\"init\") 或者 xml中指定 init-method
beanFactory.getBean(beanName)
返回factoryBean.getObject()生成的bean
判断Scope类型
第8次调用后置处理器 aop实现:AbstractAutoProxyCreator
ctor.newInstance(args)
prototype
第三次后置处理器调用 允许后置处理器修改合并的bean定义AutowiredAnnotationBeanPostProcessor 解析@Autowired和@Value,封装到InjectionMetadata
第2次调用后置处理器 获取@Autowired 修饰的构造器
singletonObject = this.singletonObjects.get(beanName)
sharedInstance = getSingleton(beanName)
缓存当前beanName的单例工厂到singletonFactories
调用singletonFactory.getObject()会执行此方法,返回未填充属性的bean第4次调用后置处理器 提前暴露bean的引用,主要用于解决循环依赖的问题
创建proxy对象
标记bean要被创建,添加到alreadyCreated中
第九次调用后置处理器DestructionAwareBeanPostProcessor将bean注册为可以销毁
缓存正在创建中的beanName列表,添加到singletonsCurrentlyInCreation
createAopProxy().getProxy(classLoader)
从单例对象池中获取
从正在创建bean的列表中移除beanName
filed属性反射完成依赖bean注入
true
合并BeanDefinition属性,返回RootBeanDefinition
创建bean实例
出现异常,执行销毁bean的逻辑
AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement#inject
disposableBeans.remove(beanName)
removeSingleton(beanName)
AutowiredAnnotationBeanPostProcessor.AutowiredMethodElement.inject
填充属性
程序调用入口
singletonObject = this.earlySingletonObjects.get(beanName)
没有,构建bean
转换对应的beanName,比如去除前缀&,转换别名
AoP逻辑
如果earlySingletonExposure为true,将早期的bean暴露出去,为true的条件:是否是单例bean && 允许循环依赖 && beanName存在于正在创建的beanName列表中
初始化bean
beanName = transformedBeanName(name)
第七次后置处理器调用InitDestroyAnnotationBeanPostProcessor处理@PostConstruct注解ApplicationContextAwareProcessor调用Aware方法,ApplicationContextAware EnvironmentAware ApplicationEventPublisherAware
markBeanAsCreated(beanName)
通过无参构造器创建bean实例 clazz.newInstance()
new ObjenesisCglibAopProxy(config)
context.getBean(\"user\")
RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName)
实例化非懒加载的单例bean
自定义销毁bean三种方式:@PreDestroy 底层实现:DestructionAwareBeanPostProcessor#postProcessBeforeDestruction实现DisposableBean接口destroy()方法@Bean(destroyMethod=\"destory\") 或者 xml中指定 destroy-method
bean实例化之前第一次后置处理器调用,可以直接返回任意Object对象
!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)
new JdkDynamicAopProxy(config)
返回普通bean
销毁bean前调用后置处理器 DestructionAwareBeanPostProcessor
销毁bean,调用自定义销毁bean方法
method.invoke 调用@Bean修饰的业务方法返回bean
循环依赖核心判断逻辑,提前暴露未填充属性的bean完成属性填充
refresh()
0 条评论
下一页