[Spring]Spring容器扩展点
2016-07-23 17:22
447 查看
假如我们要扩展Spring IoC容器,比如对某些bean后续处理,通常来说,我们并不需要去继承ApplicationContext ,取而代之的是 我们依赖于Spring本身所提供的扩展点来扩展Bean的功能。
1.通过实现BeanPostProcessor接口,来扩展bean
该接口定义了两个方法,postProcessBeforeInitialization和postProcessAfterInitialization两个方法
before 和after 初始化 提供了两个切入点 ,让我有机会对bean进行深层次的扩展。
这两个方法的两个参数 第一个 传入的是 会在容器内初始的bean, 第二个参数是bean的名字
那么如何使用该接口呢?很简单,
我们先自己写一个简单的实现Processor 让他继承 BeanPostProcessor
这里看到 我们这里只处理exampleBean,初始化前,改变了year属性,初始化后再次改变了ultimeateAnswer
然后呢,我们只需要将这个BeanProcessor注册进配置
这里什么都不指定没有任何关系,因为Spring会自动检测出类是否实现了该接口。然后将该处理器注册进spring容器。
这个时候我们自己实现的PostBeanProcessor就会将bean进行处理。
这里需要注意的事,如果通过@Bean注册Processor 那么工厂类必须实现PostBeanProcessor 否则无法检测到
第二个扩展点
2.BeanFactoryPostProcessor
该接口主要是可以修改bean的配置元数据,而而BeanPostProcessor不能而BeanPostProcessor不能
BeanFactoryPostProcessor只定义了一个方法
配置文件如下
这样就可以很简单的重新更改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的定义了
相关文章推荐
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- Spring和ThreadLocal
- Spring Boot 开发微服务
- Spring AOP动态代理-切面
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- 模拟Spring的简单实现
- Spring整合WebSocket应用示例(上)
- spring+html5实现安全传输随机数字密码键盘
- Spring中属性注入详解
- 监听器获取Spring配置文件的方法
- Java利用Sping框架编写RPC远程过程调用服务的教程
- springmvc 发送ajax出现中文乱码的解决方法汇总
- Spring MVC中Ajax实现二级联动的简单实例
- SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
- 详解Java的MyBatis框架和Spring框架的整合运用
- struts2 spring整合fieldError问题