[Spring]Spring容器扩展点

本文介绍了如何利用Spring框架的扩展点增强Bean的功能。通过实现BeanPostProcessor接口,可以在bean初始化前后进行处理,提供自定义的扩展逻辑。另一个扩展点BeanFactoryPostProcessor则允许修改bean的配置元数据。文章强调了正确注册和使用这些扩展点的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假如我们要扩展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的定义了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值