这个功能在abstractApplicationContext中并没有实现,故意留给子类去实现:
BeanFactoryPostProcessor和BeanPostProcessor很相似,只是层级不同,BeanFactoryPostProcessor 是容器级别的后处理器,对其他容器中的bean 没有影响:
这里做一个示例:
屏蔽关键字:
/**
* @author no
* @create 2018-12-21 21:48
* @desc 屏蔽敏感词
**/
public class ObscenityRemovingBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
private Set<String> obscenties;
public ObscenityRemovingBeanFactoryPostProcessor() {
obscenties = new HashSet<>();
}
public ObscenityRemovingBeanFactoryPostProcessor(Set<String> obscenties) {
this.obscenties = obscenties;
}
public void setObscenties(Set<String> obscenties){
this.obscenties.clear();
obscenties.forEach(s->{
this.obscenties.add(s.toUpperCase());
});
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
String[] ss = beanFactory.getBeanDefinitionNames();
for(String name:ss){
BeanDefinition bd = beanFactory.getBeanDefinition(name);
StringValueResolver valueResolver = new StringValueResolver() {
@Override
public String resolveStringValue(String s) {
System.out.println(s);
if(isObscene(s)) return "*******";
return s;
}
};
BeanDefinitionVisitor visitor = new BeanDefinitionVisitor(valueResolver);
visitor.visitBeanDefinition(bd);
}
}
private boolean isObscene(Object s){
return this.obscenties.contains(s.toString().toUpperCase());
}
}
<bean id="bfpp" class="com.spring.bean.PostProcessor.ObscenityRemovingBeanFactoryPostProcessor">
<property name="obscenties">
<set>
<value>abc</value>
<value>你好</value>
<value>我</value>
</set>
</property>
</bean>
<bean id="simpleBean" class="com.spring.bean.PostProcessor.SimplePostProcessor">
<property name="username" value="abc"/>
<property name="contry" value="你好"/>
<property name="password" value="123456"/>
</bean>
测试用例:
@Test
public void contextLoads() {
ConfigurableListableBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("/application-bean.xml"));
BeanFactoryPostProcessor bfpp = (BeanFactoryPostProcessor)beanFactory.getBean("bfpp");
bfpp.postProcessBeanFactory(beanFactory);
System.out.println(beanFactory.getBean("simpleBean"));
}
print:
SimplePostProcessor(username=*******, password=123456, contry=*******)