8.1.3 容器后处理器
除了上面提供的Bean
后处理器, Spring
还提供了一种容器后处理器。Bean
后处理器负责处理容器中的所有Bean
实例,而容器后处理器则负责处理容器本身。
容器后处理器必须实现BeanFactoryPostProcessor
接口。实现该接口必须实现如下一个方法。setProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
实现该方法的方法体就是对Spring
容器进行的处理,这种处理可以对Spring
容器进行自定义扩展当然也可以对Spring
容器不进行任何处理。
postProcessBeanFactory没有返回值
由于开发者不可能完全替换Spring
容器(如果完全替換Spring
容器,那就没必要使用Spring
框架了),因此postProcessBeanFactory
方法只是对Spring
容器进行后处理
,该方法无须任何返回值。
类似于BeanPostProcessor
,ApplicationContext
可自动检测到容器中的容器后处理器,并且自动注册容器后处理器。但若使用BeanFactory
作为Spring
容器,则必须手动调用该容器后处理器来处理BeanFactory
容器。
程序示例
1 | E:\workspace_QingLiangJiJavaEEQiYeYingYongShiZhang5\BeanFactoryPostProcessor |
MyBeanFactoryPostProcessor.java
下面定义了一个容器后处理器,这个容器后处理器实现了BeanFactoryPostProcessor
接口,但并未对Spring
容器进行任何处理,只是打印出一行简单的信息。
1 | package org.crazyit.app.util; |
将容器后处理器作为普通Bean
部署在容器中,如果使用ApplicationContext
作为容器,容器会自动调用BeanFactoryPostProcessor
来处理Spring
容器。但如果使用BeanFactory
作为Spring
容器,则必须手动调用容器后处理器来处理Spring
容器。例如如下主程序。
BeanTest.java
1 | package lee; |
上面程序中代码使用了ApplicationContext
作为Spring
容器, Spring
容器会自动检测容器中的所有Bean
,如果发现某个Bean
类实现了BeanFactoryPostProcessor
接口, ApplicationContext
会自动将其注册为容器后处理器。Spring
没有提供ApplicationContextPostProcessor
。也就是说,对于ApplicationContext
容器,一样使用BeanFactoryPostProcessor
作为容器后处理器。
Spring常用的后处理器
Spring
已提供如下几个常用的容器后处理器。
后处理器 | 描述 |
---|---|
PropertyPlaceholderConfigurer |
属性占位符配置器 |
PropertyOverrideConfigurer |
重写占位符配置器。 |
CustomAutowireConfigurer |
自定义自动装配的配置器。 |
CustomScopeConfigurer |
自定义作用域的配置器。 |
从上面的介绍可以看出,容器后处理器通常用于对Spring 容器进行处理,并且总是在容器实例化任何其他的Bean 之前,读取配置文件的元数据,并有可能修改这些元数据。 |
|
如果有需要,程序可以配置多个容器后处理器,多个容器后处理器可设置order 属性来控制容器后处理器的执行次序。 |
|
为了给容器后处理器指定order 属性,则要求容器后处理器必须实现Ordered 接口,因此在实现BeanFactoryPostProcessor 时,就应当考虑实现Ordered 接口。 |
|
## 容器后处理器的作用域是容器级的 ## | |
容器后处理器的作用域范围是容器级,它只对容器本身进行处理,而不对容器中的Bean 进行处理;如果需要对容器中的Bean 实例进行后处理,则应该考虑使用Bean 后处理器,而不是使用容器后处理。 |
原文链接: 8.1.3 容器后处理器