spring中實現BeanPostProcessor的后置處理器
ApplicationContextAwareProcessor
進入該實現類內部
可以看到:該類幫我們組建IOC容器,判斷我們的bean有沒有實現ApplicationContextAware接口,並作出相應處理(setApplicationContext方法)
測試:調試一個實現ApplicationContextAware接口的類的創建過程
public class User implements ApplicationContextAware { private ApplicationContext applicationContext; public User(){ System.out.println("User...constructor...."); } @PostConstruct public void init(){ System.out.println("User...init...."); } @PreDestroy public void destroy(){ System.out.println("User...destroy...."); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { /** * 容器初始化,將applicationContext作為參數傳入,其它方法就可以使用容器了 * 該方法是由ApplicationContextAwareProcessor處理器來執行的 */ this.applicationContext = applicationContext; } }
在ApplicationContextAwareProcessor類的postProcessBeforeInitialization方法中添加斷點
public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException { AccessControlContext acc = null; if (System.getSecurityManager() != null && (bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware || bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware || bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)) {//1 acc = this.applicationContext.getBeanFactory().getAccessControlContext(); } if (acc != null) { AccessController.doPrivileged(new PrivilegedAction<Object>() { public Object run() { ApplicationContextAwareProcessor.this.invokeAwareInterfaces(bean); return null; } }, acc); } else { this.invokeAwareInterfaces(bean);//2 } return bean; }
注釋1:創建User對象,初始化之前,先判斷User類是否實現了ApplicationContextAware接口
注釋2:調用invokeAwareInterfaces方法給bean設置值
private void invokeAwareInterfaces(Object bean) {
if (bean instanceof Aware) {
if (bean instanceof EnvironmentAware) {
((EnvironmentAware)bean).setEnvironment(this.applicationContext.getEnvironment());
}
if (bean instanceof EmbeddedValueResolverAware) {
((EmbeddedValueResolverAware)bean).setEmbeddedValueResolver(this.embeddedValueResolver);
}
if (bean instanceof ResourceLoaderAware) {
((ResourceLoaderAware)bean).setResourceLoader(this.applicationContext);
}
if (bean instanceof ApplicationEventPublisherAware) {
((ApplicationEventPublisherAware)bean).setApplicationEventPublisher(this.applicationContext);
}
if (bean instanceof MessageSourceAware) {
((MessageSourceAware)bean).setMessageSource(this.applicationContext);
}
if (bean instanceof ApplicationContextAware) {
((ApplicationContextAware)bean).setApplicationContext(this.applicationContext);
}
}
}
invokeAwareInterfaces方法中判斷該bean屬於哪個Aware實例,並進行相應設值處理。如果Aware是ApplicationContextAware,就將當前bean轉成ApplicationContextAware類型並調用setApplicationContext方法將ApplicationContext值設置到bean中
調試:
在bean是User類型時,setApplicationContext方法會得到執行,也即user對象中設置了ioc容器,可以在user的其它方法中使用該容器
BeanValidationPostProcessor
數據校驗
常用
對象創建完成,bean對象屬性賦值后,web中應用比較多
對頁面提交的值進行校驗
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (!this.afterInitialization) { this.doValidate(bean); } return bean; } public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (this.afterInitialization) { this.doValidate(bean); } return bean; }
postProcessBeforeInitialization方法用於初始化前校驗
postProcessAfterInitialization方法用於初始化后校驗
InitDestroyAnnotationBeanPostProcessor
該處理器用於處理@PostConstruct、@PreDestroy注解
利用反射調用bean生命周期的相關方法