知识大全 创建Bean后处理器

Posted

篇首语:知识就是力量,时间就是生命。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 创建Bean后处理器相关的知识,希望对你有一定的参考价值。

Spring攻略:创建Bean后处理器  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  一 知识点

  Bean后处理器允许在初始化回调方法前后进行额外的Bean处理 Bean后处理器的主要特性是逐个处理IoC容器中的所有Bean实例 而不只是单个Bean实例 一般来说 Bean后处理器用于检查Bean属性的有效性 或根据特定条件修改Bean属性

  Bean后处理器的基本要求是实现BeanPostProcessor接口 通过实现postProcessBeforeInitialization() 和 postProcessAfterInitialization() 方法 可以在初始化回调方法前后处理所有Bean Spring将在调用初始化回调方法前后向这两个方法传递每个Bean实例 步骤如下

  ( )构造函数或者工厂方法创建Bean实例

  ( )为Bean属性设值和Bean引用

  ( )调用感知接口中定义的设值方法

  ( )将Bean实例传递给每个Bean后处理器中的postProcessBeforeInitialization()方法

  ( )调用初始化回调方法

  ( )将Bean实例传递给每个Bean后处理器中的postProcessAfterInitialization()方法

  ( )Bean准备就绪 可以使用

  ( )容器关闭时 调用销毁回调函数

  使用Bean工厂作为IoC容器时 Bean后处理器只能编程注册 即通过addBeanPostProcessor方法注册 如果使用应用程序上下文 只需要在Bean配置文件中声明一个处理器实例 它就会自动注册

  二 代码示例

  StorageConfig标记接口

  [java]

  package deproject jackie springrecipesnote springadvancedioc;

  /**

  * 标记接口 让Bean后处理器区分应检查的Bean

  * @author jackie

  *

  */

  public interface StorageConfig

  public String getPath();

  

  package deproject jackie springrecipesnote springadvancedioc;

  /**

  * 标记接口 让Bean后处理器区分应检查的Bean

  * @author jackie

  *

  */

  public interface StorageConfig

  public String getPath();

   Cashier类

  [java]

  package deproject jackie springrecipesnote springadvancedioc;

  import java io BufferedWriter;

  import java io File;

  import java io FileWriter;

  import java io IOException;

  import java util Date;

  import springframework beans factory BeanNameAware;

  /**

  * Cashier类实现BeanNameAware感知接口和 StorageConfig标记接口

  * @author jackie

  *

  */

  public class Cashier implements BeanNameAware StorageConfig

  private String name;

  private BufferedWriter writer;

  private String path;

  public void setPath(String path)

  this path = path;

  

  public void openFile() throws IOException

  File file = new File(path name + txt );

  FileWriter fw = new FileWriter(file true);

  writer = new BufferedWriter(fw);

  

  public void checkout(ShoppingCart cart) throws IOException

  double total = ;

  for (Product product : cart getItems())

  total += product getPrice();

  

  writer write(new Date() + \\t + total + \\r\\n );

  writer flush();

  

  public void closeFile() throws IOException

  writer close();

  

  @Override

  public String getPath()

  return path;

  

  @Override

  public void setBeanName(String beanName)

  this name = beanName;

  

  

  package deproject jackie springrecipesnote springadvancedioc;

  import java io BufferedWriter;

  import java io File;

  import java io FileWriter;

  import java io IOException;

  import java util Date;

  import springframework beans factory BeanNameAware;

  /**

  * Cashier类实现BeanNameAware感知接口和 StorageConfig标记接口

  * @author jackie

  *

  */

  public class Cashier implements BeanNameAware StorageConfig

  private String name;

  private BufferedWriter writer;

  private String path;

  public void setPath(String path)

  this path = path;

  

  public void openFile() throws IOException

  File file = new File(path name + txt );

  FileWriter fw = new FileWriter(file true);

  writer = new BufferedWriter(fw);

  

  public void checkout(ShoppingCart cart) throws IOException

  double total = ;

  for (Product product : cart getItems())

  total += product getPrice();

  

  writer write(new Date() + \\t + total + \\r\\n );

  writer flush();

  

  public void closeFile() throws IOException

  writer close();

  

  @Override

  public String getPath()

  return path;

  

  @Override

  public void setBeanName(String beanName)

  this name = beanName;

  

  

  PathCheckingBeanPostProcessor自定义Bean后处理器

  [java]

  package deproject jackie springrecipesnote springadvancedioc;

  import java io File;

  import springframework beans BeansException;

  import springframewonfig BeanPostProcessor;

  /**

  * 通用的组件 确保文件在打开之前存在

  * @author jackie

  *

  */

  public class PathCheckingBeanPostProcessor implements BeanPostProcessor

  /**

  * 在文件打开之前进行路径检查

  * 须返回所处理的Bean的一个实例

  */

  @Override

  public Object postProcessBeforeInitialization(Object bean String beanName)

  throws BeansException

  // 如果Bean实现了StorageConfig接口 检查路径是否存在

  if (bean instanceof StorageConfig)

  String path = ((StorageConfig)bean) getPath();

  File file = new File(path);

  if (!file exists())

  file mkdirs();

  

  

  return bean;

  

  /**

  * 即使什么都不做 也必须返回原来的Bean实例

  */

  @Override

  public Object postProcessAfterInitialization(Object bean String beanName)

  throws BeansException

  return bean;

  

  

  package deproject jackie springrecipesnote springadvancedioc;

  import java io File;

  import springframework beans BeansException;

  import springframewonfig BeanPostProcessor;

  /**

  * 通用的组件 确保文件在打开之前存在

  * @author jackie

  *

  */

  public class PathCheckingBeanPostProcessor implements BeanPostProcessor

  /**

  * 在文件打开之前进行路径检查

  * 须返回所处理的Bean的一个实例

  */

  @Override

  public Object postProcessBeforeInitialization(Object bean String beanName)

  throws BeansException

  // 如果Bean实现了StorageConfig接口 检查路径是否存在

  if (bean instanceof StorageConfig)

  String path = ((StorageConfig)bean) getPath();

  File file = new File(path);

  if (!file exists())

  file mkdirs();

  

  

  return bean;

  

  /**

  * 即使什么都不做 也必须返回原来的Bean实例

  */

  @Override

  public Object postProcessAfterInitialization(Object bean String beanName)

  throws BeansException

  return bean;

  

  Bean配置

  []

  <?xml version= encoding= UTF ?>

  <beans xmlns=

  xmlns:xsi= instance

  xsi:schemaLocation= beans xsd >

  <! 注册Bean后处理器 >

  <bean class= deproject jackie springrecipesnote springadvancedioc PathCheckingBeanPostProcessor />

  <bean id= aaa class= deproject jackie springrecipesnote springadvancedioc Battery >

  <property name= name value= AAA />

  <property name= price value= />

  </bean>

  <bean id= cdrw class= deproject jackie springrecipesnote springadvancedioc Battery >

  <property name= name value= CD RW />

  <property name= price value= />

  </bean>

  <bean id= dvdrw class= deproject jackie springrecipesnote springadvancedioc Battery >

  <property name= name value= DVD RW />

  <property name= price value= />

  </bean>

  <bean id= shoppingCart class= deproject jackie springrecipesnote springadvancedioc ShoppingCart scope= prototype />

  <bean id= cashier class= deproject jackie springrecipesnote springadvancedioc Cashier init method= openFile destroy method= closeFile >

  <property name= path value= c:/cashier />

  </bean>

  </beans>

  <?xml version= encoding= UTF ?>

  <beans xmlns=

  xmlns:xsi= instance

  xsi:schemaLocation= beans xsd >

  <! 注册Bean后处理器 >

  <bean class= deproject jackie springrecipesnote springadvancedioc PathCheckingBeanPostProcessor />

  <bean id= aaa class= deproject jackie springrecipesnote springadvancedioc Battery >

  <property name= name value= AAA />

  <property name= price value= />

  </bean>

  <bean id= cdrw class= deproject jackie springrecipesnote springadvancedioc Battery >

  <property name= name value= CD RW />

  <property name= price value= />

  </bean>

  <bean id= dvdrw class= deproject jackie springrecipesnote springadvancedioc Battery >

  <property name= name value= DVD RW />

  <property name= price value= />

  </bean>

  <bean id= shoppingCart class= deproject jackie springrecipesnote springadvancedioc ShoppingCart scope= prototype />

  <bean id= cashier class= deproject jackie springrecipesnote springadvancedioc Cashier init method= openFile destroy method= closeFile >

  <property name= path value= c:/cashier />

  </bean>

  </beans>测试类

  [java]

  package deproject jackie springrecipesnote springadvancedioc;

  import java io IOException;

  import junit Test;

  import ntext ApplicationContext;

  import ntext support ClassPathXmlApplicationContext;

  /**

  * @author jackie

  *

  */

  public class BeanPostProcessorTest

  @Test

  public void testBeanPostProcessor() throws IOException

  ApplicationContext applicationContext = new ClassPathXmlApplicationContext( applicationContext xml );

  Product aaa = (Product) applicationContext getBean( aaa );

  Product cdrw = (Product) applicationContext getBean( cdrw );

  Product dvdrw = (Product) applicationContext getBean( dvdrw );

  ShoppingCart shoppingCart = (ShoppingCart) applicationContext getBean( shoppingCart );

  shoppingCart addItem(aaa);

  shoppingCart addItem(cdrw);

  shoppingCart addItem(dvdrw);

  Cashier cashier = (Cashier) applicationContext getBean( cashier );

  cashier checkout(shoppingCart);

  

  

  package deproject jackie springrecipesnote springadvancedioc;

  import java io IOException;

  import junit Test;

  import ntext ApplicationContext;

  import ntext support ClassPathXmlApplicationContext;

  /**

  * @author jackie

  *

  */

  public class BeanPostProcessorTest

  @Test

  public void testBeanPostProcessor() throws IOException

  ApplicationContext applicationContext = new ClassPathXmlApplicationContext( applicationContext xml );

  Product aaa = (Product) applicationContext getBean( aaa );

  Product cdrw = (Product) applicationContext getBean( cdrw );

  Product dvdrw = (Product) applicationContext getBean( dvdrw );

  ShoppingCart shoppingCart = (ShoppingCart) applicationContext getBean( shoppingCart );

  shoppingCart addItem(aaa);

  shoppingCart addItem(cdrw);

  shoppingCart addItem(dvdrw);

  Cashier cashier = (Cashier) applicationContext getBean( cashier );

  cashier checkout(shoppingCart);

  

  

cha138/Article/program/Java/ky/201311/27853

相关参考

知识大全 自然的访问spring容器中的bean

   Spring依赖其IOC特征轻松的管理著一堆非常有价值的bean这些bean在spring容器中的依赖关系都已注入好所以相互调用非常方便  但既然是有价值的bean

知识大全 控制bean定制器的技巧

  概要  集成开发环境(IDEs)可以解剖一个bean类的文件并且生成一个带参数的对话框开发者可以利用它来定制自己的bean但是这些标准的定制对话框留下了很多参数以满足它的适应性灵活性和美学目的本文

知识大全 Bean标签库

Struts1.x系列教程(6):Bean标签库  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Spring容器对Bean组件的管理

Spring容器对Bean组件的管理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一Bean对

知识大全 关于在bean里面打印html的利弊看法

  servlet由于打印代码全部写在class中间所以代码编写很麻烦也不便于维护sun公司才推出了jsp  但这是否意味着我们在jsp+bean的架构中就不能在bean里面输出代码呢?    封装在

知识大全 JSP中bean的使用

JSP中bean的使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!cha138/Art

知识大全 JSP和BEAN详细剖析

JSP和BEAN详细剖析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &n

知识大全 有状态会话Bean及其多种调用方法

JBoss:有状态会话Bean及其多种调用方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一

知识大全 详解Spring中bean的scope

详解Spring中bean的scope  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如何使用s

知识大全 我来说说Bean的使用方法

我来说说Bean的使用方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  最近讨论主要围绕在公共