BeanPostProcessors使用总结
2015-11-03 20:29
736 查看
1、bean生成过程
2、BeanPostProcessors接口
如果这个接口的某个实现类被注册到某个容器,那么该容器的每个受管Bean在调用初始化方法之前,都会获得该接口实现类的一个回调。容器调用接口定义的方法时会将该受管Bean的实例和名字通过参数传入方法,进过处理后通过方法的返回值返回给容器。要使用BeanPostProcessor回调,就必须先在容器中注册实现该接口的类,那么如何注册呢?BeanFactory和ApplicationContext容器的注册方式不大一样:若使用BeanFactory,则必须要显示的调用其addBeanPostProcessor()方法进行注册,参数为BeanPostProcessor实现类的实例;如果是使用ApplicationContext,那么容器会在配置文件在中自动寻找实现了BeanPostProcessor接口的Bean,然后自动注册,我们要做的只是配置一个BeanPostProcessor实现类的Bean就可以了。
假如我们使用了多个的BeanPostProcessor的实现类,那么如何确定处理顺序呢?其实只要实现Ordered接口,设置order属性就可以很轻松的确定不同实现类的处理顺序了。
3、示例
3.1 applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 声明注解方式加载bean--> <context:annotation-config/> <!-- 要加载的bean的包路径--> <context:component-scan base-package="com.meituan.hyt.test1"/> <bean id="userPostProcessor" class="com.meituan.hyt.test1.UserPostProcessor"/> </beans>
3.2 自己的业务bean
package com.meituan.hyt.test1; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class User { @Value("老名字") private String name; @Value("50") private Integer id; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", id=" + id + '}'; } }
3.3 postProcessor bean
package com.meituan.hyt.test1; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class UserPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object o, String s) throws BeansException { if(o instanceof User){ User user = (User)o; user.setName("新名字"); user.setId(100); return user; } return o; } @Override public Object postProcessAfterInitialization(Object o, String s) throws BeansException { return o; } }
3.4 测试方法
package com.meituan.hyt.test1; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main2 { public static void main(String[] args) { ApplicationContext cxt = new ClassPathXmlApplicationContext("applicationContext.xml"); User user = (User) cxt.getBean("user"); System.out.println(user.toString()); } }
3.5 执行结果
如果没有<bean id="userPostProcessor" class="com.meituan.hyt.test1.UserPostProcessor"/>User{name='老名字', id=50}
添加<bean id="userPostProcessor" class="com.meituan.hyt.test1.UserPostProcessor"/>
User{name='新名字', id=100}
4、与BeanFactoryPostProcessor接口的区别
BeanFactoryPostProcessor接口实现类可以在当前BeanFactory初始化后,bean实例化之前对BeanFactory做一些处理。BeanFactoryPostProcessor是针对于bean容器的,在调用它时,BeanFactory只加载了bean的定义,还没有对它们进行实例化,所以我们可以通过对BeanFactory的处理来达到影响之后实例化bean的效果。跟BeanPostProcessor一样,ApplicationContext也能自动检测和调用容器中的BeanFactoryPostProcessor。package com.meituan.hyt.test1; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; public class UserBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { System.out.println("BeanFactoryPostProcessor doing"); } }
applicationContext.xml中添加bean配置
<bean id="userBeanFactoryPostProcessor" class="com.meituan.hyt.test1.UserBeanFactoryPostProcessor"/>
重新运行,结果
BeanFactoryPostProcessor doing
User{name='新名字', id=100}
相关文章推荐
- PHP优化03 PDO-mysql扩展模块安装部署
- PHP框架
- Xftp使用教程——问答方式
- 使用php原生代码上传图片至SAE的STORAGE
- PHP Laravel
- php生成缩略图
- php字符串处理函数总结
- ThinkPHP 学习每日总结
- php上传七牛实例
- Elasticsearch-PHP 索引操作
- thinkphp php新版本废弃 preg_replace /e 修饰符
- ubuntu下不加index.php无法正常访问
- php对接西部数码API
- js、php、thrift的坑
- Config PHP5.6 on WIN7 IIS
- PHP获取系统时间和设置所在时区
- PHP模拟发送POST请求之四、加强file_get_contents()发送POST请求
- PHP中的抽象类与接口
- php 重启命令
- PHP中的多态