您的位置:首页 > 编程语言 > Java开发

[Spring]Spring容器扩展点

2016-07-23 17:22 447 查看
假如我们要扩展Spring IoC容器,比如对某些bean后续处理,通常来说,我们并不需要去继承ApplicationContext ,取而代之的是 我们依赖于Spring本身所提供的扩展点来扩展Bean的功能。

1.通过实现BeanPostProcessor接口,来扩展bean

public interface BeanPostProcessor {

Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;

Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

}


该接口定义了两个方法,postProcessBeforeInitialization和postProcessAfterInitialization两个方法

before 和after 初始化 提供了两个切入点 ,让我有机会对bean进行深层次的扩展。

这两个方法的两个参数 第一个 传入的是 会在容器内初始的bean, 第二个参数是bean的名字

那么如何使用该接口呢?很简单,

我们先自己写一个简单的实现Processor 让他继承 BeanPostProcessor

public class BeanProcesser implements BeanPostProcessor{

public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException {
ExampleBean bean = null;
if(arg1.equals("exampleBean")) {
bean = (ExampleBean)arg0;
System.out.println(bean.year);
System.out.println(bean.ultimeateAnswer);
bean.ultimeateAnswer += "world";
}
return bean;
}

public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException {
ExampleBean bean = null;
if(arg1.equals("exampleBean")) {
bean = (ExampleBean)arg0;
System.out.println(bean.year);
System.out.println(bean.ultimeateAnswer);
bean.year = 1992;

}
return bean;
}

}


这里看到 我们这里只处理exampleBean,初始化前,改变了year属性,初始化后再次改变了ultimeateAnswer

然后呢,我们只需要将这个BeanProcessor注册进配置

<bean class="com.spring.BeanProcesser"/>


这里什么都不指定没有任何关系,因为Spring会自动检测出类是否实现了该接口。然后将该处理器注册进spring容器。

这个时候我们自己实现的PostBeanProcessor就会将bean进行处理。

这里需要注意的事,如果通过@Bean注册Processor 那么工厂类必须实现PostBeanProcessor 否则无法检测到

第二个扩展点

2.BeanFactoryPostProcessor

该接口主要是可以修改bean的配置元数据,而而BeanPostProcessor不能而BeanPostProcessor不能

BeanFactoryPostProcessor只定义了一个方法

void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
同样的道理,只要实现该类,然后注册进Spring 配置 就好。

public class FactoryProcessor implements BeanFactoryPostProcessor {

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanDefinition bd =	beanFactory.getBeanDefinition("exampleBean");
MutablePropertyValues pv = bd.getPropertyValues();
if(pv.contains("year"))
{
pv.addPropertyValue("ultimeateAnswer", "nothing ");
}

}

}


配置文件如下

<bean class="com.spring.FactoryProcessor"/>


这样就可以很简单的重新更改bean的定义了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Spring