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包括以下对象:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~