BeanPostProcessor接口

来源:互联网 发布:博客数据库设计 编辑:程序博客网 时间:2024/05/15 06:46

今天学习了一下Spring的BeanPostProcessor接口,该接口作用是:如果我们需要在Spring容器完成Bean的实例化,配置和其他的初始化后添加一些自己的逻辑处理,我们就可以定义一个或者多个BeanPostProcessor接口的实现。

 

 

下面我们来看一个简单的例子:

[java] view plaincopy
  1. package com.spring.test.di;  
  2.    
  3. import org.springframework.beans.BeansException;  
  4. import org.springframework.beans.factory.config.BeanPostProcessor;  
  5.    
  6. public class BeanPostPrcessorImpl implements BeanPostProcessor {  
  7.    
  8.     // Bean 实例化之前进行的处理  
  9.     public Object postProcessBeforeInitialization(Object bean, String beanName)  
  10.            throws BeansException {  
  11.        System.out.println("对象" + beanName + "开始实例化");  
  12.        return bean;  
  13.     }  
  14.    
  15.     // Bean 实例化之后进行的处理  
  16.     public Object postProcessAfterInitialization(Object bean, String beanName)  
  17.            throws BeansException {  
  18.        System.out.println("对象" + beanName + "实例化完成");  
  19.        return bean;  
  20.     }  
  21. }  

只要将这个BeanPostProcessor接口的实现定义到容器中就可以了,如下所示:

[html] view plaincopy
  1. <bean class="com.spring.test.di.BeanPostPrcessorImpl"/>  

测试代码如下:

[java] view plaincopy
  1. package com.spring.test.di;  
  2.    
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.FileSystemXmlApplicationContext;  
  5.    
  6. public class TestMain {  
  7.    
  8.     /** 
  9.      * @param args 
  10.      */  
  11.     public static void main(String[] args) throws Exception {  
  12.    
  13.        // 得到ApplicationContext对象  
  14.        ApplicationContext ctx = new FileSystemXmlApplicationContext(  
  15.               "applicationContext.xml");  
  16.        // 得到Bean  
  17.        ctx.getBean("logic");  
  18.     }  
  19. }  

运行以上测试程序,可以看到控制台打印结果:

 

对象logic开始实例化

对象logic实例化完成

 

BeanPostProcessor的作用域是容器级的,它只和所在容器有关。如果你在容器中定义了BeanPostProcessor,它仅仅对此容器中的bean进行后置。它不会对定义在另一个容器中的bean进行任何处理。

注意的一点:

BeanFactoryApplicationContext对待bean后置处理器稍有不同。ApplicationContext会自动检测在配置文件中实现了BeanPostProcessor接口的所有bean,并把它们注册为后置处理器,然后在容器创建bean的适当时候调用它。部署一个后置处理器同部署其他的bean并没有什么区别。而使用BeanFactory实现的时候,bean 后置处理器必须通过下面类似的代码显式地去注册:


[java] view plaincopy
  1. BeanPostPrcessorImpl beanPostProcessor = new BeanPostPrcessorImpl();  
  2. Resource resource = new FileSystemResource("applicationContext.xml");  
  3.  ConfigurableBeanFactory factory = new XmlBeanFactory(resource);  
  4.  factory.addBeanPostProcessor(beanPostProcessor);  
  5.  factory.getBean("logic");  

原创粉丝点击