- 浏览: 85429 次
- 性别:
- 来自: 西安
最新评论
-
xuhang1128:
good
Spring源码解析 BeanPostProcessor的实现 -
zhudaokun:
呵呵……好帖,收藏一下
Spring源码解析1 IOC容器的初始化
package com.spring.ch04; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class PropertyConfigurerDemo { public static void main(String[] args) { ConfigurableListableBeanFactory bf=new XmlBeanFactory(new ClassPathResource("/META-INF/postprocessor.xml")); BeanFactoryPostProcessor bfpp=(BeanFactoryPostProcessor)bf.getBean("bfpp"); bfpp.postProcessBeanFactory(bf); System.out.println(bf.getBean("simpleBean")); } }
BeanFactory配置文件:postprocessor.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "> <!-- 利用PropertyPlaceholderConfigurer回调处理器将替换从已配置的属性文件中加载属性的值, 只要值符合某种格式规则,默认情况下是${property-name},就会发生替换。 --> <bean id="bfpp" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:/META-INF/bfpp.properties"></property> </bean> <bean id="simpleBean" class="com.spring.ch04.SimplePostProcessor"> <property name="connectionString" value="${simpleBean.connectionString}"/> <property name="password" value="${simpleBean.password}"/> <property name="username" value="${simpleBean.username}"/> </bean> </beans>
SimplePostProcessor .java
package com.spring.ch04; public class SimplePostProcessor { private String connectionString; private String password; private String username; public void setConnectionString(String connectionString) { this.connectionString = connectionString; } public void setPassword(String password) { this.password = password; } public void setUsername(String username) { this.username = username; } public String toString(){ StringBuilder sb=new StringBuilder(); sb.append("SimplePostProcessor{connectionString=").append(this.connectionString); sb.append(",username=").append(this.username).append(",password=").append(this.password); return sb.toString(); } }
bfpp.properties
simpleBean.connectionString=Hello simpleBean.password=imaginecup simpleBean.username=qiaoyanhui
实现一个BeanFactoryPostProcessor,实现一个简单的回调处理器,它能去除潜在的"流氓"属性值,例如bean定义中留下bollocks这样的字眼。
配置文件:BeanFactory.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "> <bean id="bfpp" class="com.spring.ch04.ObscenityRemovingBeanFactoryPostProcessor"> <property name="obscenties"> <set> <value>bollocks</value> <value>winky</value> <value>bum</value> <value>Microsoft</value> </set> </property> </bean> <bean id="simpleBean" class="com.spring.ch04.SimplePostProcessor"> <property name="connectionString" value="bollocks"/> <property name="password" value="imaginecup"/> <property name="username" value="Microsoft"/> </bean> </beans>
ObscenityRemovingBeanFactoryPostProcessor.java
package com.spring.ch04; import java.util.*; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionVisitor; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.util.StringValueResolver; public class ObscenityRemovingBeanFactoryPostProcessor implements BeanFactoryPostProcessor { private Set<String> obscenties; public ObscenityRemovingBeanFactoryPostProcessor(){ this.obscenties=new HashSet<String>(); } public void postProcessBeanFactory( ConfigurableListableBeanFactory beanFactory) throws BeansException { String[] beanNames=beanFactory.getBeanDefinitionNames(); for(String beanName:beanNames){ BeanDefinition bd=beanFactory.getBeanDefinition(beanName); StringValueResolver valueResover=new StringValueResolver() { public String resolveStringValue(String strVal) { if(isObscene(strVal)) return "*****"; return strVal; } }; BeanDefinitionVisitor visitor=new BeanDefinitionVisitor(valueResover); visitor.visitBeanDefinition(bd); } } public boolean isObscene(Object value){ String potentialObscenity=value.toString().toUpperCase(); return this.obscenties.contains(potentialObscenity); } public void setObscenties(Set<String> obscenties) { this.obscenties.clear(); for(String obscenity:obscenties){ this.obscenties.add(obscenity.toUpperCase()); } } }
执行类:
package com.spring.ch04; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class PropertyConfigurerDemo { public static void main(String[] args) { ConfigurableListableBeanFactory bf=new XmlBeanFactory(new ClassPathResource("/META-INF/BeanFactory.xml")); BeanFactoryPostProcessor bfpp=(BeanFactoryPostProcessor)bf.getBean("bfpp"); bfpp.postProcessBeanFactory(bf); System.out.println(bf.getBean("simpleBean")); } }
输出结果:
SimplePostProcessor{connectionString=*****,username=*****,password=imaginecup
ObscenityRemovingBeanFactoryPostProcessor.java的改进类
ObscenityRemovingBeanFactoryPostProcessor1.java
package com.spring.ch04; import java.util.*; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionVisitor; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.util.StringValueResolver; public class ObscenityRemovingBeanFactoryPostProcessor1 implements BeanFactoryPostProcessor, BeanNameAware { private Set<String> obscenities; public ObscenityRemovingBeanFactoryPostProcessor1(){ this.obscenities=new HashSet<String>(); this.obscenitiesRemoved=new HashSet<String>(); } public void setObscenities(Set<String> obscenities) { this.obscenities.clear(); for(String obscenity :obscenities){ this.obscenities.add(obscenity.toUpperCase()); } } private Set<String> obscenitiesRemoved; private String name; @Override public void postProcessBeanFactory( ConfigurableListableBeanFactory beanFactory) throws BeansException { String[] beanNames=beanFactory.getBeanDefinitionNames(); for(String beanName:beanNames){ //核查我们有没有为该bean修改BeanDefinition if(beanName.equals(this.name)) { continue; } BeanDefinition bd=beanFactory.getBeanDefinition(beanName); StringValueResolver valueResolver=new StringValueResolver(){ @Override public String resolveStringValue(String strVal) { if(isObscene(strVal)) { obscenitiesRemoved.add(strVal); return "******"; } return strVal; } }; BeanDefinitionVisitor visitor=new BeanDefinitionVisitor(valueResolver); visitor.visitBeanDefinition(bd); } //将一个集合注册名 为obscenitiesRemoved的单例bean beanFactory.registerSingleton("obscenitiesRemoved", this.obscenitiesRemoved); //打印被过滤的属性值 System.out.println(obscenitiesRemoved); } public boolean isObscene(Object obj){ String potentialObscenity=obj.toString().toUpperCase(); return this.obscenities.contains(potentialObscenity); } public void setBeanName(String name) { this.name=name; } }
发表评论
-
Spring MVC 整体的流程
2011-04-30 13:17 2268DispatcherServlet(DispatcherSer ... -
Spring ApplicationContext
2010-10-06 13:07 3927ApplicationContext是一个IoC容器,但它扩展 ... -
Spring属性编辑器
2010-10-06 12:03 3231什么是属性编辑器,作用? * 自定义属性编辑器,spring配 ... -
Spring源码解析 BeanPostProcessor的实现
2010-10-02 21:45 2494BeanPostProcessor是使用IoC容器时经常使用会 ... -
Spring源码解析 lazy-init属性和预实例化
2010-10-02 19:02 3391默认情况下会在容器启动时初始化bean, 但是我们可以指定Be ... -
Spring源码解析 依赖注入
2010-10-02 18:35 6356当IoC容器的初始化完毕后,我们就要接触IoC容器的核心功能: ... -
Spring源码解析3 IOC容器的初始化
2010-10-02 13:12 1544上一次我们了解BeanDefinition的在载入和解析,现在 ... -
Spring源码解析 2 IOC容器的初始化
2010-10-02 12:06 3007前面我们分析了:IoC容器的第一个步骤BeanDefiniti ... -
Spring源码解析1 IOC容器的初始化
2010-10-01 22:03 2093参考《Spring技术内幕》一书: IoC容器的基本接 ... -
Spring 引入的运用
2010-09-14 10:33 2914参考《Spring高级程序设计》 引入是Spring提 ...
相关推荐
com-spring-ioc-demo:源码主要是学习Spring IOC的原理,以及对Bean的注册及控制,主要运用以下类对Spring进行扩展学习:BeanPostProcessor,BeanFactoryAware,BeanNameAware,ApplicationContextAware,FactoryBean...
1 BeanFactoryPostProcessor作用 public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor { /** * 可以修改容器Bean内部的定义信息,全部的bean definitions会加载但是bean没有...
主要介绍了Spring注解驱动扩展原理BeanFactoryPostProcessor,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Spring注解驱动开发第36讲——或许,这是你以前没看过的从源码角度理解BeanFactoryPostProcessor的原理
《spring开发指南》,欢迎使用spring框架的各位下载。
该项目提供了,如果在Spring 类中遇到以下情况之一,该将发出编译器警告和错误: @Configuration类不能是最终的。 @Configuration类必须具有可见的无参数构造函数。 @Configuration类的构造函数不得为@Autowired...
了解spring的加载机制 beanPostProcessor,beanFactoryPostProcessor 的使用 springmvc 的父子容器 aop切面说明 公司内部培训课件
* 所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建 * * * BeanFactoryPostProcessor原理:
3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.3. 使用FactoryBean定制实例化逻辑 3.8. ApplicationContext 3.8.1. 利用MessageSource实现国际化 3.8.2. 事件 3.8.3. 底层资源的访问 3.8.4. ...
3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.3. 使用FactoryBean定制实例化逻辑 3.8. ApplicationContext 3.8.1. 利用MessageSource实现国际化 3.8.2. 事件 3.8.3. 底层资源的访问 3.8.4. ...
MyRestUtil给部门写的...更新记录2017.10.11 将 RestUtilInit 由普通bean修改为 BeanFactoryPostProcessor ,保证IRequestHandle优先与其他任何bean注册到容器中解决bean的依赖问题,不需要在接口类中增加 @Lazy 注解
3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.3. 使用FactoryBean定制实例化逻辑 3.8. The ApplicationContext 3.8.1. BeanFactory 还是 ApplicationContext? 3.8.2. 利用MessageSource实现国际化 ...
3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.3. 使用FactoryBean定制实例化逻辑 3.8. The ApplicationContext 3.8.1. BeanFactory 还是 ApplicationContext? 3.8.2. 利用MessageSource实现国际化 ...
类的管理:▣▣▣ 反射机制:▣▣ 网络编程:▣ JAVA8新特性: Java消息服务Java Message Service: 1.2 JVM-HotSpot 虚拟机监控工具:虚拟机监控工具概述▣Attach 机制▣查看JVM进程 1.3 Tomcat Tomcat介绍 Tomcat...
3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.2.1. PropertyPlaceholderConfigurer示例 3.7.2.2. PropertyOverrideConfigurer示例 3.7.3. 使用FactoryBean定制实例化逻辑 3.8. ApplicationContext 3.8.1. ...
什么是BeanPostProcessor,什么是BeanFactoryPostProcessor?Service中注入的Mapper接口是什么对象?Spring Bean的生命周期,Spring循环依赖等等问题。课程讲解细致,一行一行带你读懂代码,一行一行调试源码,彻...
BeanFactoryPostProcessor介绍及用法.txt java设计模式 通俗解释.txt jdbc 连三种常用数据库.txt JNDI介绍.txt servlet简介.doc Servlet与filter.doc ssh各配置文件头.txt xmlhttprequest...
8.1-BeanFactoryPostProcessor 8.2-BeanDefinitionRegistryPostProcessor 8.3-ApplicationListener使用 8.4-@EventListener与SmartInitializingSingleton 9,弹簧容器创建过程 10,Servlett3.0 10.1-简介 10.2-...
4.8.2 使用BeanFactoryPostProcessor 自定义配置元数据. 81 4.8.2.1 示例:PropertyPlaceholderConfigurer. 82 4.8.2.2 示例:PropertyOverrideConfigurer 83 4.8.3 使用FactoryBean 来自定义实例化...
后置处理器(BeanPostProcessor.BeanFactoryPostProcessor等) 2).监听器(ApplicationListener) 3).Spring容器启动过程; 3).web原理 1).Servlet3.0标准新增特性 2).异步请求相关 本视频使用了maven...