Spring中有三种初始化Bean的方式:
- 对初始化方法添加注解 @PostConstruct
- 实现 InitializingBean 接口
- 实现 SmartInitializingSingleton 接口
首先要测试三种初始化的执行顺序,如下代码:
1 |
|
执行顺序显而易见,接下开是要说下这三种方式都是在什么地方进行执行的。
初始化 bean 的部分代码在 AbstractAutowireCapableBeanFactory.java
中的 initializeBean
方法中。
1 | protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) { |
@PostConstruct
① 那个位置上,会取出所有的 BeanPostProcessor 接口,并依次调用,其中有个后处理器为 CommonAnnotationBeanPostProcessor
,它就是处理 PostConstruct 的关键,它的构造方法中 含有 PostConstruct 注解,声明拥有这个注解的方法是初始化方法。
1 | public CommonAnnotationBeanPostProcessor() { |
它还继承了 InitDestroyAnnotationBeanPostProcessor
,该父类实现了 BeanPostProcessor 的接口,它本身未实现。
1 | public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { |
InitializingBean
② 这个位置上会调用 bean 的 InitializingBean 方法,这个方法会判断这个 bean 是否实现了 InitializingBean 接口,如果实现了,则调用其 afterPropertiesSet() 方法。
1 | protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd) |