spring(三):spring中BeanPostProcessor的使用


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生命周期的相關方法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM