spring bean的初始化从doCreateBean方法开始,依次会调用下面三个方法执行bean的初始化。大部分方法都在AbstractAutowireCapableBeanFactory类中。
实例化
createBeanInstance()方法根据BeanDef获取bean对应的class通过反射调用构造函数进行bean的实例化。
这里会判断是否使用工厂或指定构造函数进行实例化bean,否则使用无参构造函数进行实例化。
属性注入
populateBean()方法会进行属性的注入,也就是完成IOC依赖注入功能。也就是我们通过@AutoWire,@Resource等注入的属性。
在属性注入前如果有InstantiationAwareBeanPostProcessors会尝试执行其接口方法。
初始化
initializeBean()方法会完成一些后置callback方法的执行
1、aware方法回调
invokeAwareMethod()回调aware方法,如果Bean实现了Spring的Aware接口,会通过回调方式将特定的资源设置到Bean中。这里的aware方法只回调和bean相关的aware,包括BeanNameAware、BeanClassLoaderAware和BeanFactoryAware。
2、BeanPostProcessors 前置方法回调
Spring提供了BeanPostProcessor接口,可以在Bean的初始化前后执行一些额外的处理逻辑,这里会调用前置处理方法
3、初始化方法回调
如果Bean实现了InitializingBean接口,Spring会调用其重写的afterPropertiesSet()初始化方法,进行一些自定义的初始化逻辑。
另外也可以通过@PostConstruct自定义初始化方法,也会在这个阶段被调用。
也可以通过xml init-method属性指定初始化方法
4、BeanPostProcessors 后置方法回调
同第2步,这里会调用BeanPostProcessor的后置方法。
spring在bean初始化的过程中有上面这么多回调方法可以进行扩展,我们需要记住他们的执行顺序,然后根据业务在适当点进行扩展既可。像AOP其实就是通过BeanPostProcessor进行实现的。还有自定义初始化方法应该都有用过。