spring bean实例化过程及顺序

spring bean实例化过程及顺序_第1张图片

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进行实现的。还有自定义初始化方法应该都有用过。

你可能感兴趣的:(spring,spring,java,后端)