除了上篇文章讨论的Bean后处理器,Spring还提供了一种容器后处理器。Bean后处理器负责处理容器中的所有Bean实例,而容器后处理器则负责处理容器本身。
容器后处理器必须实现 BeanFactoryPostProcessor 接口,该接口中有一个方法:
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException
实现该方法的方法体就是对Spring容器进行的处理,这种处理可以对Spring容器进行自定义扩展,当然也可以对Spring容器不进行任何处理。
Axe.java :
public interface Axe {
public String chop();
}
SteelAxe.java :
public class SteelAxe implements Axe {
@Override
public String chop() {
return "钢斧砍柴真快";
}
public SteelAxe() {
System.out.println("Spring实例化依赖Bean:SteelAxe实例...");
}
}
Person.java :
public interface Person {
public void useAxe();
}
Chinese.java :
public class Chinese implements Person{
private Axe axe;
public void setAxe(Axe axe) {
System.out.println("Spring执行依赖关系注入,setAxe...");
this.axe = axe;
}
public Chinese() {
System.out.println("Spring实例化主调Bean:Chinese实例...");
}
@Override
public void useAxe() {
System.out.println(axe.chop());
}
}
FirstBeanFactoryPostProcessor.java :
public class FirstBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {
System.out.println("程序对Spring所做的BeanFactory的初始化没有改变...");
System.out.println("Spring容器是:"+beanFactory);
}
}
bean.xml核心配置:
<bean id="chinese" class="com.bean.Chinese">
<property name="axe" ref="steelAxe"/>
</bean>
<bean id="steelAxe" class="com.bean.SteelAxe"/>
<bean id="beanFactoryPostProcessor" class="com.bean.FirstBeanFactoryPostProcessor"/>
Test.java :
public class Test {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("bean.xml");
Person p=(Person) ctx.getBean("chinese");
p.useAxe();
}
}
运行Test.java,控制台输出:
程序会自动搜索容器中实现了BeanFactoryPostProcessor接口的类,并将它注册成容器后处理器。
Spring已经提供了如下几个常用的容器后处理器:
① PropertyPlaceholderConfigurer:属性占位符配置器。
② PropertyOverrideConfigurer:重写占位符配置器。
③ CustomAutowireConfigurer:自定义自动装配的配置器。
④ CustomScopeConfigurer:自定义作用域的配置器。
从上面的介绍可以看出,容器后处理器通常用于对Spring容器进行处理,并且总是在容器实例化任何其他的Bean之前,读取配置文件的元数据,并有可能修改这些元数据。
如果有需要,程序可以配置多个容器后处理器,多个容器后处理器可设置order属性来控制容器后处理器的执行次序。