假如我们要扩展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;
}
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;
}
}
然后呢,我们只需要将这个BeanProcessor注册进配置
这个时候我们自己实现的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 ");
}
}
}