您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Spring容器扩展点:Bean后置处理器

2024/5/18 13:49:44发布21次查看
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:
<bean id="messi" class="twm.spring.lifecycletest.footballplayer"> <property name="name" value="messi"></property> <property name="team" value="barcelona"></property></bean>
创建类beanfactorypostprocessorimpl,实现接口beanfactorypostprocessor:
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文件对应的内容进行替换。
相关推荐:
关于spring bean扩展接口的方法介绍
resourceloaderaware 接口 - [ spring中文手册 ] 
以上就是spring容器扩展点:bean后置处理器的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product