Spring
bean 注入过程?
Spring 源码学习【四】依赖注入过程_一颗贪婪的星-CSDN 博客_spring 依赖注入源码
IOC 容器在初始化的过程中,首先建立 BeanDefinition 的数据结构,接下来进行依赖注入,处理 bean 之间的关系。
getBean()触发依赖注入。
getBean()方法定义在 BeanFactory 接口中,抽象基类 AbstractBeanFactory 实现的 getBean()方法。
createBean
getBean()方法中多次调用 createBean()方法。createBean()方法是用来创建 Bean 实例的,并进行一些其他操作。
createBean()方法是一个模版方法,由其子类 AbstractAutowireCapableBeanFactory 实现。
到这里,我们就已经得到依赖注入后的 Bean 实例了,这个过程看起来十分简单,但实际上有两个要点需要我们格外关注:其一,创建 Bean 实例(createBeanInstance);其二,进行依赖注入(populateBean)。
createBeanInstance
createBeanInstance 通过适当的实例化策略来创建一个 Bean 实例,这里需要注意 Spring5.0 的新特性:通过设置 Bean 创建回调来覆盖工厂方法和构造函数。
在这个过程中,通过默认构造方法(无参构造)是基本的实例化策略,这个策略 Spring 的实现中提供了两种创建 Bean 的方式:其一,通过 JVM 反射创建 Bean 实例;其二,通过 cgLib 动态代理创建 Bean 实例。
populateBean
这里就是依赖注入的核心了,在这里,首先由 InstantiationAwareBeanPostProcessors 进行依赖注入前的处理,判断是否对 Bean 的 Property 进行注入,接下来先处理 autowire 的注入,这里的 autowire 指的是在配置文件中通过 autowire=”byName”或者 autowire=”byType”等属性配置的 bean,最后处理 Property 属性注入。
最终的依赖注入实际上调用了 BeanWrapper 接口的 setPropertyValues 方法,这个方法 AbstractPropertyAccessor 实现,在这个方法中,取得了所有的属性,对每一个属性进行注入。