- 浏览: 87424 次
- 性别:
- 来自: 西安
最新评论
-
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 2313DispatcherServlet(DispatcherSer ... -
Spring ApplicationContext
2010-10-06 13:07 3999ApplicationContext是一个IoC容器,但它扩展 ... -
Spring属性编辑器
2010-10-06 12:03 3288什么是属性编辑器,作用? * 自定义属性编辑器,spring配 ... -
Spring源码解析 BeanPostProcessor的实现
2010-10-02 21:45 2548BeanPostProcessor是使用IoC容器时经常使用会 ... -
Spring源码解析 lazy-init属性和预实例化
2010-10-02 19:02 3431默认情况下会在容器启动时初始化bean, 但是我们可以指定Be ... -
Spring源码解析 依赖注入
2010-10-02 18:35 6412当IoC容器的初始化完毕后,我们就要接触IoC容器的核心功能: ... -
Spring源码解析3 IOC容器的初始化
2010-10-02 13:12 1582上一次我们了解BeanDefinition的在载入和解析,现在 ... -
Spring源码解析 2 IOC容器的初始化
2010-10-02 12:06 3049前面我们分析了:IoC容器的第一个步骤BeanDefiniti ... -
Spring源码解析1 IOC容器的初始化
2010-10-01 22:03 2140参考《Spring技术内幕》一书: IoC容器的基本接 ... -
Spring 引入的运用
2010-09-14 10:33 2971参考《Spring高级程序设计》 引入是Spring提 ...
相关推荐
com-spring-ioc-demo:源码主要是学习Spring IOC的原理,以及对Bean的注册及控制,主要运用以下类对Spring进行扩展学习:BeanPostProcessor,BeanFactoryAware,BeanNameAware,ApplicationContextAware,FactoryBean...
【Java核心知识体系4:AOP原理和切面应用】 ...理解和熟练运用AOP能帮助开发者编写更高效、结构更清晰的代码。同时,掌握`BeanFactoryPostProcessor`和`BeanPostProcessor`接口,有助于深入理解Spring的生命周期管理。
- **设计模式的应用**:Spring在实例化Bean的过程中运用了多种设计模式,包括但不限于: - **模板方法模式**:在`AbstractApplicationContext`的`refresh`方法中体现。 - **观察者模式**:通过`...
本文将深入探讨Spring中注解的实现原理,帮助你更好地理解和运用这些核心概念。 首先,让我们从注解的基础知识开始。注解在Java中是一种元数据,它提供了在代码中嵌入信息的方式,而这些信息可以被编译器或运行时...
以及`BeanFactoryPostProcessor`和`InstantiationAwareBeanPostProcessor`接口,它们允许在bean实例化前后进行自定义处理。 4. **log4j-1.2.17.jar**:这并不是Spring框架的一部分,但它是Java日志记录的常用库。...
在Spring框架中,Bean的生命周期是其核心概念之一,它涉及到Bean从创建到销毁的整个过程。这个过程中,Spring提供了一系列的...在实践中,我们需要根据具体需求灵活运用这些生命周期特性,以达到最佳的应用设计和实现。
在源码中,`org.springframework.beans.factory.config`包包含了许多关于生命周期的接口和类,如InitializingBean、DisposableBean以及BeanFactoryPostProcessor等。 6. **事件驱动模型**:Spring提供了基于...
通过`BeanFactoryPostProcessor`接口,开发者可以在容器初始化时插入自定义代码。 2. **工厂方法**:Spring使用`FactoryBean`接口实现工厂方法模式。当请求一个实现了`FactoryBean`的Bean时,Spring会调用`...
这个源码包是学习和理解Spring工作原理的宝贵资源,通过深入研究源码,开发者可以更好地掌握其内部机制,从而在实际项目中更有效地运用Spring。 首先,Spring的核心特性包括依赖注入(Dependency Injection,DI),...
- 通过综合运用Spring与其他框架(如Struts、WebWork2、Hibernate等),构建出高质量的应用程序,展示Spring在实际项目中的强大功能和灵活性。 - 案例涉及的技术栈非常广泛,不仅展示了Spring的核心能力,也体现了...
此外,`BeanFactoryPostProcessor`接口允许自定义扩展,如`PropertyPlaceholderConfigurer`用于处理配置文件中的占位符。 2. **工厂方法**:Spring提供的`FactoryBean`接口是工厂方法模式的体现。它使得我们能够...
4. **Spring Bean生命周期**:清楚Spring Bean的生命周期,使用BeanFactoryPostProcessor和BeanPostProcessor,理解Spring代理的工作原理,掌握bean创建顺序的确定,以及避免按类型注入bean时的问题。 5. **面向切面...
本文将深入剖析Spring内核,揭示其设计思想和实现原理,帮助开发者更好地理解和运用这一强大的工具。 一、依赖注入(Dependency Injection,DI) Spring的核心特性之一就是依赖注入,它使得组件之间的耦合度降低,...
通过实现`AutowiredAnnotationBeanPostProcessor`或`BeanFactoryPostProcessor`接口,可以自定义`@Autowired`的解析逻辑。 ### 6. 结论 `@Autowired`是Spring框架中重要的依赖注入方式,它简化了Bean的配置,提高...
- 在调用 `BeanFactoryPostProcessor` 方法时,此时bean还未实例化,只是刚刚被解析成了`BeanDefinition`对象。 3. **Bean的生命周期** - Spring IoC容器负责管理Bean的生命周期,包括bean的创建、属性赋值、初始...
不使用XML定义档进行 Bean设置 Aware 相关介面 BeanPostProcessor BeanFactoryPostProcessor PropertyPlaceholderConfigurer PropertyOverrideConfigurer CustomEditorConfigurer ...
【标题】BP(BeanPostProcessor) 【描述】BP(BeanPostProcessor)是Spring框架中的一个核心接口,它提供了对Spring容器管理的bean在初始化...在实际开发中,可以根据具体需求灵活运用,提升系统的功能性和稳定性。