您的位置:首页 > 编程语言 > Java开发

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

2012-04-18 15:33 543 查看
使用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的执行的位置是在初始化之前
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息