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包括以下对象:




浙公网安备 33010602011771号