Spring后置处理器BeanPostProcessor

Spring中有一个接口BeanPostProcessor,该接口我们叫后置处理器,作用是

在Bean对象实例化和依赖注入完毕后,在显示调用初始化方法的前后添加我们自己的逻辑。接口源码如下:


Spring后置处理器BeanPostProcessor


一、自定义后置处理器

<code> 
 

public

class

MyBeanPostProcessor

implements

BeanPostProcessor

{

public

Object

postProcessBeforeInitialization

(Object bean, String beanName)

throws

BeansException

{ System.out.println(

"初始化 before--实例化的bean对象:"

+beanName);

return

bean; }

public

Object

postProcessAfterInitialization

(Object bean, String beanName)

throws

BeansException

{ System.out.println(

"初始化 after...实例化的bean对象:"

+beanName);

return

bean; } }/<code>

注:接口中两个方法不能返回null,如果返回null那么在后续初始化方法将报空指针异常或者通过getBean()方法获取不到bena实例对象,因为后置处理器从Spring IoC容器中取出bean实例对象没有再次放回IoC容器中

然后定义实体类User:

<code>

public

class

User

{

private

int

id;

private

String name;

public

User

(

)

{ System.

out

.println(

"User 被实例化"

); }

public

int

getId

(

)

{

return

id; }

public

void

setId

(

int

id

)

{

this

.id = id; }

public

String

getName

(

)

{

return

name; }

public

void

setName

(

String name

)

{ System.

out

.println(

"设置name="

+name);

this

.name = name; }

public

void

customInit

(

)

{ System.

out

.println(

"User 中自定义的初始化方法"

); } }/<code>

再将User类配置成bean对象:

<code> (initMethod = 

"customInit"

)

public

User

user

()

{ User user =

new

User(); user.setName(

"张三"

);

return

user; }/<code>

这里也可以使用xml配置。

然后启动我们的项目,在控制台输出如下:

User 被实例化

设置name=张三

初始化 before--实例化的bean对象:user

User 中自定义的初始化方法

初始化 after...实例化的bean对象:user

通过输出语句我们能看到postProcessBeforeInitialization方法的输出语句是在Bean实例化及属性注入后执行的,且在自定义的初始化方法之前执行(通过Bean注解的initMethod指定)。而postProcessAfterInitialization方法是在自定义初始化方法执行之后执行的。

注意:

1.BeanFactory和ApplicationContext两个容器对待bean的后置处理器稍微有些不同。ApplicationContext容器会自动检测Spring配置文件中那些bean所对应的Java类实现了BeanPostProcessor接口,并自动把它们注册为后置处理器。在创建bean过程中调用它们,所以部署一个后置处理器跟普通的bean没有什么太大区别。

2.BeanFactory容器注册bean后置处理器时必须通过代码显示的注册,在IoC容器继承体系中的ConfigurableBeanFactory接口中定义了注册方法。

<code>ConfigurableBeanFactory factory = 

new

XmlBeanFactory(

new

ClassPathResource(

"applicationContext.xml"

)); factory.addBeanPostProcessor(

new

MyBeanPostProcessor());/<code>

二、多个后置处理器

我们可以在Spring中添加多个BeanPostProcessor(后置处理器)接口实现类,默认情况下Spring容器会根据后置处理器定义的顺序依次执行。

当然,如果你想指定后置处理器的调用顺序,那么你可以通过实现Ordered接口的getOrder方法来自定义顺序。该方法默认值为 0,优先级最高,值越大优先级越低。

<code> 

public

class

MyBeanPostProcessor2

implements

BeanPostProcessor

,

Ordered

{

public

Object

postProcessBeforeInitialization

(Object bean, String beanName)

throws

BeansException

{ System.out.println(

"第2个before--实例化的bean对象:"

+beanName);

return

bean; }

public

Object

postProcessAfterInitialization

(Object bean, String beanName)

throws

BeansException

{ System.out.println(

"第2个after...实例化的bean对象:"

+beanName);

return

bean; }

public

int

getOrder

()

{

return

2

; } }/<code>


分享到:


相關文章: