使用spring的特殊bean --- 对bean进行后处理和对bean工厂进行后处理简单了解

来源:互联网 发布:淘宝怎么设置优惠活动 编辑:程序博客网 时间:2024/05/16 04:57
使用spring的特殊bean  ---  对bean进行后处理和对bean工厂进行后处理简单了解1.对bean进行后处理后处理是在bean实例化以及装配完成之后发生的,在bean被创建以及装配之后,BeanPostProcessor提供了两次修改bean的机会,来对bean进行后处理操作。程序清单 :我们来创建一个类来继承BeanPostProcessor接口来测试:public class PersonServiceBean implements BeanPostProcessor,BeanFactoryPostProcessor {public PersonServiceBean() {super();System.out.println("构造函数的执行============");}// 初始化bean after之后的操作@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName)throws BeansException {// 传过来的beanName,也就是id是不可以改的// 通过bean的类型处理if (bean instanceof PersonServiceBean) {System.out.println("=====在被创建之后装配之后处理操作最后一次修改==========after"+ bean + "========" + beanName);}return bean;}// 初始化bean之前@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName)throws BeansException {// TODO Auto-generated method stub// 处理bean之前完成的一些操作if (bean instanceof PersonServiceBean) {System.out.println("========在被创建之后装配之后处理操作第一次修改=======before"+ bean + "========" + beanName);}return bean;}}我们在xml中的配置如下:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd" default-lazy-init="true"><!-- default-lazy-init="true" 使用的时候在初始化 --><!-- 配置一个bean实例,bean的创建配置及维护都交给了容器管理 --><!-- 如果是默认的单列,执行一次,在容器初始化的时候执行prototype 每次请求都触发一次 ,在调用后处理方法的时候要用他,因为它是在每次发送请求都会执行一次 --><bean id="personServiceBean" class="cn.csdn.hr.service.PersonServiceBean" scope="prototype"></bean></beans>测试:public void test() {//读取配置文件,创建一次  初始化的时候会执行一次构造方法,在调用getBean的时候会再次执行构造方法ApplicationContext ac = new ClassPathXmlApplicationContext(new String[]{"anbeans.xml"});PersonServiceBean personServiceBean = (PersonServiceBean) ac.getBean("personServiceBean");}通过以上的代码可以看出实现了两个方法,分别为:postProcessAfterInitialization和postProcessBeforeInitialization,在xml中没有scope="prototype"的情况下,只会调用无参构造,如果加上此属性,才可以把自己写的bean后处理的类中实例的方法写出来。default-lazy-init="true" 在使用的时候再初始化输出的结果为:构造函数的执行============2012-4-18 4:52:57 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@9f671b: defining beans [personServiceBean]; root of factory hierarchy构造函数的执行====================在被创建之后装配之后处理操作第一次修改=======beforecn.csdn.hr.service.PersonServiceBean@73a7ab========personServiceBean=====在被创建之后装配之后处理操作最后一次修改==========aftercn.csdn.hr.service.PersonServiceBean@73a7ab========personServiceBean2.对bean工厂进行后处理对bean工厂进行操作的是BeanFactoryPostProcessor,它是在bean工厂载入所有的bean的定义后,并且在实例化bean之前,对bean的工厂做一些后处理操作程序清单: StudentServiceBean.java public class StudentServiceBean implements BeanFactoryPostProcessor{@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory arg0)throws BeansException {System.out.println("处理操作================");}}我们要在xml中进行配置:<bean id="studentServiceBean" class="cn.csdn.hr.service.StudentServiceBean"></bean>这样,当我们再次运行的时候看到的结果为:处理操作================构造函数的执行============2012-4-18 4:59:15 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@9f671b: defining beans [personServiceBean,studentServiceBean]; root of factory hierarchy构造函数的执行====================在被创建之后装配之后处理操作第一次修改=======beforecn.csdn.hr.service.PersonServiceBean@1c86be5========personServiceBean=====在被创建之后装配之后处理操作最后一次修改==========aftercn.csdn.hr.service.PersonServiceBean@1c86be5========personServiceBean可以看出BeanFactoryPostProcessor的执行的位置是在初始化之前