Spring中Bean的实例化过程

AbstractAutowireCapableBeanFactory.doCreateBean方法

一、创建实例对象
调用createBeanInstance 方法中

会获取容器中所有的BeanPostProcessor对象,并进行循环筛选出来自于 SmartInstantiationAwareBeanPostProcessor接口的实现类,
并调用实现类的 determineCandidateConstructors方法获取到有@Autowired 或者 @Value注解的构造方法。

如果构造方法是无参的,则委托SimpleInstantiationStrategy.instantiate,最终委托BeanUtils.instantiateClass(constructorToUse, new Object[0]);方法完成Bean对象的创建

如果构造方法是有参的,则调用AbstractAutowireCapableBeanFactory.autowireConstructor方法,并委托
ConstructorResovler.autowireConstructor | instantiate 方法,
最终还是委托SimpleInstantiationStrategy.instantiate,最终委托 BeanUtils.instantiateClass(ctor, args);方法完成Bean对象的创建

二、初始化实例对象
调用AbstractAutowireCapableBeanFactory.populateBean完成对Bean对象的属性、方法参数进行依赖注入


通过BeanPostProcessor,主要是CommonAnnotationBeanPostProcessor(继承自InitDestroyAnnotationBeanPostProcessor)、AutowireAnnotationBeanPostProcessor,获取到BeanDefinition中的注解信息,包括@PostConstruct,@PreDestroy,@Resource(前三个由CommonAnnotationBeanPostProcessor进行解析,都是jdk提供的注解)
,@Autowired,@Value,@Inject(由AutowireAnnotationBeanPostProcessor进行解析),@Component是由ComponentScan进行扫描成BeanDefinition的,只能作用于Bean的类上,即@Target({ElementType.TYPE})
都是收集到了一个InjectionMetadata的大对象,将Bean对应的methods,fields进行封装成InjectedElement,最终进行循环调用完成InjectedElement.inject注入
InjectedElement包括以下对象:

posted @   vello  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示