`
imaginecup
  • 浏览: 87424 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

BeanFactoryPostProcessor类的运用

阅读更多
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;

	}
	

}

 

分享到:
评论

相关推荐

    com-spring-ioc-demo:源码主要是学习Spring IOC的原理,以及对Bean的注册及控制,主要运用以下类对Spring进行扩展学习:BeanPostProcessor,BeanFactoryAware,BeanNameAware,ApplicationContextAware,FactoryBean,BeanDefinitionRegistryPostProcessor,BeanFactoryPostProcessor,BeanPostProcessor,ResourceLoaderA

    com-spring-ioc-demo:源码主要是学习Spring IOC的原理,以及对Bean的注册及控制,主要运用以下类对Spring进行扩展学习:BeanPostProcessor,BeanFactoryAware,BeanNameAware,ApplicationContextAware,FactoryBean...

    Java核心知识体系4:AOP原理和切面应用.pdf

    【Java核心知识体系4:AOP原理和切面应用】 ...理解和熟练运用AOP能帮助开发者编写更高效、结构更清晰的代码。同时,掌握`BeanFactoryPostProcessor`和`BeanPostProcessor`接口,有助于深入理解Spring的生命周期管理。

    spring源码学习

    - **设计模式的应用**:Spring在实例化Bean的过程中运用了多种设计模式,包括但不限于: - **模板方法模式**:在`AbstractApplicationContext`的`refresh`方法中体现。 - **观察者模式**:通过`...

    spring中注解的实现原理

    本文将深入探讨Spring中注解的实现原理,帮助你更好地理解和运用这些核心概念。 首先,让我们从注解的基础知识开始。注解在Java中是一种元数据,它提供了在代码中嵌入信息的方式,而这些信息可以被编译器或运行时...

    spring基本项目的主要6个jar包

    以及`BeanFactoryPostProcessor`和`InstantiationAwareBeanPostProcessor`接口,它们允许在bean实例化前后进行自定义处理。 4. **log4j-1.2.17.jar**:这并不是Spring框架的一部分,但它是Java日志记录的常用库。...

    第四期.Bean的生命周期.zip

    在Spring框架中,Bean的生命周期是其核心概念之一,它涉及到Bean从创建到销毁的整个过程。这个过程中,Spring提供了一系列的...在实践中,我们需要根据具体需求灵活运用这些生命周期特性,以达到最佳的应用设计和实现。

    spring-spring-framework-4.3.24.RELEASE.zip

    在源码中,`org.springframework.beans.factory.config`包包含了许多关于生命周期的接口和类,如InitializingBean、DisposableBean以及BeanFactoryPostProcessor等。 6. **事件驱动模型**:Spring提供了基于...

    Spring 设计模式总结1

    通过`BeanFactoryPostProcessor`接口,开发者可以在容器初始化时插入自定义代码。 2. **工厂方法**:Spring使用`FactoryBean`接口实现工厂方法模式。当请求一个实现了`FactoryBean`的Bean时,Spring会调用`...

    spring-framework-3.2.13.RELEASE 源码

    这个源码包是学习和理解Spring工作原理的宝贵资源,通过深入研究源码,开发者可以更好地掌握其内部机制,从而在实际项目中更有效地运用Spring。 首先,Spring的核心特性包括依赖注入(Dependency Injection,DI),...

    spring 宝典

    - 通过综合运用Spring与其他框架(如Struts、WebWork2、Hibernate等),构建出高质量的应用程序,展示Spring在实际项目中的强大功能和灵活性。 - 案例涉及的技术栈非常广泛,不仅展示了Spring的核心能力,也体现了...

    掌握Spring设计模式:Java工程师必备指南

    此外,`BeanFactoryPostProcessor`接口允许自定义扩展,如`PropertyPlaceholderConfigurer`用于处理配置文件中的占位符。 2. **工厂方法**:Spring提供的`FactoryBean`接口是工厂方法模式的体现。它使得我们能够...

    Spring认证考试指南

    4. **Spring Bean生命周期**:清楚Spring Bean的生命周期,使用BeanFactoryPostProcessor和BeanPostProcessor,理解Spring代理的工作原理,掌握bean创建顺序的确定,以及避免按类型注入bean时的问题。 5. **面向切面...

    spring内核详解

    本文将深入剖析Spring内核,揭示其设计思想和实现原理,帮助开发者更好地理解和运用这一强大的工具。 一、依赖注入(Dependency Injection,DI) Spring的核心特性之一就是依赖注入,它使得组件之间的耦合度降低,...

    spring的annotation的autowired

    通过实现`AutowiredAnnotationBeanPostProcessor`或`BeanFactoryPostProcessor`接口,可以自定义`@Autowired`的解析逻辑。 ### 6. 结论 `@Autowired`是Spring框架中重要的依赖注入方式,它简化了Bean的配置,提高...

    Spring IoC源码深度剖析开源架构源码2021.pdf

    - 在调用 `BeanFactoryPostProcessor` 方法时,此时bean还未实例化,只是刚刚被解析成了`BeanDefinition`对象。 3. **Bean的生命周期** - Spring IoC容器负责管理Bean的生命周期,包括bean的创建、属性赋值、初始...

    开源框架 Spring Gossip

    不使用XML定义档进行 Bean设置 Aware 相关介面 BeanPostProcessor BeanFactoryPostProcessor PropertyPlaceholderConfigurer PropertyOverrideConfigurer CustomEditorConfigurer ...

    bp

    【标题】BP(BeanPostProcessor) 【描述】BP(BeanPostProcessor)是Spring框架中的一个核心接口,它提供了对Spring容器管理的bean在初始化...在实际开发中,可以根据具体需求灵活运用,提升系统的功能性和稳定性。

Global site tag (gtag.js) - Google Analytics