[Spring]Spring容器扩展点

假如我们要扩展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注册进配置


这里什么都不指定没有任何关系,因为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的定义了

你可能感兴趣的:(Spring)