createBean方法
createBean
该抽象方法的默认实现是在类 AbstractAutowireCapableBeanFactory 中实现,代码如下:
1 |
// AbstractAutowireCapableBeanFactory.java protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) if (logger.isTraceEnabled()) { // <1> 确保此时的 bean 已经被解析了 try { try { try { |
---|
上面方法处理的流程如下
<1>
处,解析 bean 类型。<2>
处,验证和准备覆盖方法,处理 lookup-method 和 replace-method 配置。这两个配置存放在 BeanDefinition 中的methodOverrides
属性中,在bean实例化的时候如果检测到存在methodOverrides属性,会动态地为当前bean生成代理,并使用对应的拦截器为bean做增强处理。<3>
处,实例化的前置处理。<4>
处,若上一步处理返回的 bean 为空,则调用 doCreateBean 创建 bean 实例。
下面会对<3>
和<4>
处做一些详细的分析,感兴趣的小伙伴可以看看。
2.1 实例化的前置处理
1 |
// AbstractAutowireCapableBeanFactory.java protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) { |
---|
这个方法核心就在于 applyBeanPostProcessorsBeforeInstantiation()
和 applyBeanPostProcessorsAfterInitialization()
两个方法,before 为实例化前的后处理器应用,after 为实例化后的后处理器应用。
1 |
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) { public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) Object result = existingBean; |
---|
在 resolveBeforeInstantiation 方法中,当前置处理方法返回的 bean 不为空时,后置处理才会被执行。前置处理器是 InstantiationAwareBeanPostProcessor 类型的,该种类型的处理器一般用在 Spring 框架内部,比如 AOP 模块中的AbstractAutoProxyCreator
抽象类间接实现了这个接口中的 postProcessBeforeInstantiation
方法,所以 AOP 可以在这个方法中生成为目标类的代理对象。这部分还没有详细去了解,属于TODO。
2.2 调用 doCreateBean
方法创建 bean
1 |
// AbstractAutowireCapableBeanFactory.java protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) // BeanWrapper 是对 Bean 的包装,其接口中所定义的功能很简单包括设置获取被包装的对象,获取被包装 bean 的属性描述器 // <3> 判断是否有后置处理 // <4> 解决单例模式的循环依赖 // 开始初始化 bean 实例对象 // <7> 循环依赖处理 // 注册销毁逻辑 return exposedObject; |
---|
整体的思路如下:
<1>
处,从缓存中获取 BeanWrapper 实现类对象,并清理相关记录。<2>
处,创建 bean 实例,并将实例包裹在 BeanWrapper 实现类对象中返回。createBeanInstance
中包含三种创建 bean 实例的方式:- 通过工厂方法创建 bean 实例
- 通过构造方法自动注入(autowire by constructor)的方式创建 bean 实例
- 通过无参构造方法方法创建 bean 实例
若 bean 的配置信息中配置了 lookup-method 和 replace-method,则会使用 CGLIB 增强 bean 实例。
<3>
处,应用 MergedBeanDefinitionPostProcessor 后置处理器相关逻辑。<4>
处,根据条件决定是否提前暴露 bean 的早期引用(early reference),用于处理循环依赖问题。<5>
处,调用populateBean
方法向 bean 实例中填充属性。<6>
处,调用initializeBean
方法完成余下的初始化工作。<7>
处,循环依赖处理。<8>
处,注册销毁逻辑。