BeanPostProcessor(Bean后置处理器)常用在对bean内部的值进行修改;实现Bean的动态代理等。
beanfactorypostprocessor和beanpostprocessor都是spring初始化bean时对外暴露的扩展点。但它们有什么区别呢?
由《理解bean生命周期》的图可知:beanfactorypostprocessor是生命周期中最早被调用的,远远早于beanpostprocessor。它在spring容器加载了bean的定义文件之后,在bean实例化之前执行的。也就是说,spring允许beanfactorypostprocessor在容器创建bean之前读取bean配置元数据,并可进行修改。例如增加bean的属性和值,重新设置bean是否作为自动装配的侯选者,重设bean的依赖项等等。
在srping配置文件中可以同时配置多个BeanFactoryPostProcessor,并通过在xml中注册时设置’order’属性来控制各个BeanFactoryPostProcessor的执行次序。
BeanFactoryPostProcessor接口定义如下:
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}接口只有一个方法postProcessBeanFactory。该方法的参数是ConfigurableListableBeanFactory类型,实际开发中,我们常使用它的getBeanDefinition()方法获取某个bean的元数据定义:BeanDefinition。它有这些方法: 
看个例子:
配置文件中定义了一个bean:
创建类beanFactoryPostProcessorImpl,实现接口BeanFactoryPostProcessor:
技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作
public class beanFactoryPostProcessorImpl implements BeanFactoryPostProcessor{
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("beanFactoryPostProcessorImpl");
BeanDefinition bdefine=beanFactory.getBeanDefinition("messi");
System.out.println(bdefine.getPropertyValues().toString());
MutablePropertyValues pv = bdefine.getPropertyValues();
if (pv.contains("team")) {
PropertyValue ppv= pv.getPropertyValue("name");
TypedStringValue obj=(TypedStringValue)ppv.getValue();
if(obj.getValue().equals("Messi")){
pv.addPropertyValue("team", "阿根延");
}
}
bdefine.setScope(BeanDefinition.SCOPE_PROTOTYPE);
}
}调用类:
public static void main(String[] args) throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
footballPlayer obj = ctx.getBean("messi",footballPlayer.class);
System.out.println(obj.getTeam());
}输出:
PropertyValues: length=2; bean property ‘name’; bean property ‘team’ 阿根延
在《PropertyPlaceholderConfigurer应用》提到的PropertyPlaceholderConfigurer这个类就是BeanFactoryPostProcessor接口的一个实现。它会在容器创建bean之前,将类定义中的占位符(诸如${jdbc.url})用properties文件对应的内容进行替换。
相关推荐:









