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

本文介绍了Spring框架中BeanPostProcessor和BeanFactoryPostProcessor的作用及实现方式。BeanPostProcessor允许开发者在Bean实例化后进行定制化的操作,而BeanFactoryPostProcessor则可以在Bean实例化前对BeanFactory进行后处理。
使用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之后的操作 @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { // 传过来的beanName,也就是id是不可以改的 // 通过bean的类型处理 if (bean instanceof PersonServiceBean) { System.out.println("=====在被创建之后装配之后处理操作最后一次修改==========after" + bean + "========" + beanName); } return bean; } // 初始化bean之前 @Override public 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========personServiceBean 2.对bean工厂进行后处理 对bean工厂进行操作的是BeanFactoryPostProcessor,它是在bean工厂载入所有的bean的定义后,并且在实例化bean之前,对bean的工厂做一些后处理操作 程序清单: StudentServiceBean.java public class StudentServiceBean implements BeanFactoryPostProcessor{ @Override public 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的执行的位置是在初始化之前
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值