-
Instantiation:表示实例化,对象还未生成
-
Initialization:表示初始化,对象已经生成
InstantiationAwareBeanPostProcessor继承自BeanPostProcessor,它内部提供了3个方法,再加上BeanPostProcessor接口内部的2个方法,所以实现这个接口需要实现5个方法。
1.postProcessBeforeInstantiation()–自定义对象–>postProcessAfterInitialization();//一般不会走
2.postProcessBeforeInstantiation() -->postProcessAfterInstantiation–>postProcessBeforeInitialization()–>postProcessAfterInitialization()
我们看出:postProcessBeforeInstantiation一定执行, postProcessAfterInitialization一定执行.
1.InstantiationAwareBeanPostProcessor接口方法执行时机
实现该接口的常见类有CommonAnnotationBeanPostProcessor
、AutowiredAnnotationBeanPostProcessor
、AbstractAutoProxyCreator
。
1.1 postProcessBeforeInstantiation()执行时机
AbstractAutowireCapableBeanFactory
#createBean
方法中的resolveBeforeInstantiation
方法,doCreateBean
方法之前。
AbstractAutoProxyCreator
重写了该方法,作用是获取到切面类,在实例化第一个单例bean时,对所有我们自定义的切面类进行解析。然后放到缓存中,key是切面类name,value是advisor类型的数组,因为一个切面类可以有多个增强方法。
1.2 postProcessAfterInstantiation()执行时机
AbstractAutowireCapableBeanFactory
#doCreateBean
方法中的populateBean
方法。
- 默认返回true。
1.3 postProcessProperties()执行时机
AbstractAutowireCapableBeanFactory
#doCreateBean
方法中的populateBean
方法。postProcessAfterInstantiation()
方法执行之后。
AutowiredAnnotationBeanPostProcessor
重写了该方法,作用是获取到Autowired注解标注的字段(反射),然后调用getBean方法实例化,然后设置到引入它的bean中。CommonAnnotationBeanPostProcessor
重写了该方法,作用是获取到Resource注解标注的字段(反射),然后调用getBean方法实例化,然后设置到引入它的bean中。
2. BeanPostProcessor接口方法执行时机
2.1 postProcessBeforeInitialization()执行时机
AbstractAutowireCapableBeanFactory
#doCreateBean
方法中的initializeBean
方法。
CommonAnnotationBeanPostProcessor
继承的InitDestroyAnnotationBeanPostProcessor
重写了该方法,作用是在每个类初始化时执行加了@PostConstruct注解的方法。做一些初始化工作。
2.2 postProcessAfterInitialization()执行时机
AbstractAutowireCapableBeanFactory
#doCreateBean
方法中的initializeBean
方法。
AbstractAutoProxyCreator
重写了该方法,作用是为aop类创建代理对象。