createBean
2024-02-01 15:28:11 2 举报
spring createBean详细流程
作者其他创作
大纲/内容
判断resolvedAutowireMode自动装配类型
属性应用到Bean中applyPropertyValues
返回Bean
通过工厂实例化instantiateUsingFactoryMethod()
Object bean = resolveBeforeInstantiation
有参构造实例化autowireConstructor
xml中通过<properties>标签添加的属性
否
CommonAnnotationBeanPostProcessor完成@PostContruct调用
一旦用户在此阶段创建代理对象,则spring不会再走后续的创建bean的过程了,所有生命周期的方法都不会再进行回调处理
获取早期引用时会回调该方法。spring中只有aop相关处理实现了该接口SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference
是
invokeAwareMethods
CommonAnnotationBeanPostProcessor完成@PostConstruct、@PreDestroy、@Resource的解析
CommonAnnotationBeanPostProcessor完成@Resource的注入
此回调允许最后一次修改BeanDefinitionspring中主要进行相关注解的解析
其中循环依赖,也是发生在属性装配过程中。该过程存在大量的递归,装配一个属性,没有实例化时,会从getBean处开始执行,一环套一环
bean不为空
AutowiredAnnotationBeanPostProcessor完成@Autowired、@Value、@Inject注解的解析
obtainFromSupplier()
无参构造进行实例化instantiateBean
实例化initializeBean
不是合成类,同时存在InstantiationAware
mbdToUse.prepareMethodOverrides()处理xml配置文件中的lookup-method和replace-method方法
填充Bean属性populateBean
不是合成类&&同时存在InstantiationAware后置处理器
回调InstantiationAwareBeanPostProcessorpostProcessAfterInstantiation如果返回false,则不再进行后续的属性装配和声明周期方法的回调
注册Bean的销毁逻辑registerDisposableBeanIfNecessary
bean中定义的init-method方法
是否存在InstantiationAware
(BeanNameAware) bean).setBeanName(beanName);((BeanClassLoaderAware) bean).setBeanClassLoader(bcl); ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
获取早期bean的引用,如果程序不存在循环依赖,那么三级缓存用不到。如产生了循环依赖,那么在获取早期引用时,如果bean中的方法被AOP切点所匹配到,此时AOP相关逻辑会介入,此时会创建代理类并返回
invokeCustomInitMethod
1. @Bean注解方法注入的bean会存在这个值2. 通过xml配置注入的BeanDefinition,如果配置工厂方法(实例工厂、静态工厂)也有该属性
doCreateBean
访问权限校验
执行BeanPostProcessor的后置处理applyBeanPostProcessorsAfterInitialization
找到最优的构造方法
获取Bean的Class对象resolveBeanClass
AutowiredAnnotationBeanPostProcessor完成@Autowired、@Value、@Inject注解注入
回调InstantiationAwareBeanPostProcessor的applyBeanPostProcessorsBeforeInstantiation方法,给用户一个机会进行代理类创建
AOP代理对象通过属性注入产生循环依赖,通过getEarlyReference方法获取早期对象可以解决。此处如果校验失败,则可能是@Async或者@Validated生成代理类造成的,这种方式的代理类,是通过BeanPostProcessor的后置处理方法PostProcessorsAfterInitialization中进行生成的1. AsyncAnnotationBeanPostProcessor处理@Async2. MethodValidationPostProcessor处理@Validated,仅在方法上添加会代理其中@RequestBody和普通Bean对象校验,会有专门的参数解析器完成
InitializingBean#afterPropertiesSet
getFactoryMethodName不为空
抛BeanCreationException异常
调用调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition
earlySingletonExposure为true
new RootBeanDefinition(mbd)
注解方式的属性自动注入InstantiationAwareBeanPostProcessor#postProcessProperties
暴露早期对象,三个条件缺一不可earlySingletonExposure= 单例对象 && 允许循环引用 && 对象正在创建中
invokeInitMethods
循环依赖检查。避免产生循环依赖时,普通对象注入到属性中后,又生成了代理对象
觉得对您有用,欢迎右上角点赞
执行BeanPostProcessor的前置处理applyBeanPostProcessorsBeforeInitialization
如果容器中存在AOP相关,比如AspectJAwareAdvisorAutoProxyCreator类则会进行Advisor对象的创建,保证创建代理对象时,所需的Advisor都已经创建完毕
只有使用xml配置文件的方式,才会存在该装配方式
是否实现Supplier接口
createBean
如果返回对象不为空applyBeanPostProcessorsAfterInitialization
bw为空,同时propertyValues不为空
applyMergedBeanDefinitionPostProcessors
0 条评论
下一页