在源码AbstractAutowireCapableBeanFactory的创建bean方法doCreate方法中。
bean已经实例化后,且populateBean方法是填充属性之后,就开始调用初始化方法initializeBean。
进入其方法。
protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged(new PrivilegedAction
1、进入invokeAwareMethods方法可以看到:
激活Aware接口:1、BeanNameAware。2、BeanClassLoaderAware。3、BeanFactoryAware。
2、在执行bean初始化前处理器之后,开始调用init方法
进入方法invokeInitMethods(beanName, wrappedBean, mbd);
protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)
throws Throwable {
//bean是否实现InitializingBean接口中的方法afterPropertiesSet
//如果实现,则优先执行afterPropertiesSet方法
boolean isInitializingBean = (bean instanceof InitializingBean);
if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
if (logger.isDebugEnabled()) {
logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
}
if (System.getSecurityManager() != null) {
try {
AccessController.doPrivileged(new PrivilegedExceptionAction
由上面方法很容易看得出2点:
1、bean是否实现InitializingBean接口中的方法afterPropertiesSet,如果实现,则优先执行afterPropertiesSet方法,实现自己的初始化业务逻辑。
2、用户在xml配置文件中配置了初始化属性init-method
都是在初始化bean的时候执行的。执行顺序afterPropertiesSet先执行---> init-method后执行
postProcessBeforeInstantiation(实例化前置处理器{前提是返回null})---> postProcessAfterInstantiation(实例化后置处理器) ---> postProcessPropertyValues(实例化的属性值) ---> Aware(BeanNameAware、BeanFactoryAware...) ----> postProcessBeforeInitialization(初始化前处理器) ---> lnitializingBean接口的afterPropertiesSet ---> init-method(自定义配置的初始化init-method方法) ---> postProcessAfterInitialization(初始化后处理器)