1:分析
该接口是spring提供给我们的另一个扩展点,用于在解析配置信息为BeanDefinition之后在生成bean之前,加入一个允许我们修改BeanDefinition的点,接口定义如下:
// 是只有一个方法的函数接口
@FunctionalInterface
public interface BeanFactoryPostProcessor {
// 我们可以通过该方法来修改beandefinition,从而达到修改最终bean的效果
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
另外关于beandefinition可以参考这里。
2:实例
2.1:说明
实现修改属性的自定义占位符,从而设置属性值为最终值。
2.2:测试的bean
public class MyBeanFactoryProcessorTestBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
}
2.3:自定义BeanFactoryPostProcessor
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// 如果beanName是myBeanFactoryProcessorTestBean,则替换
// name属性的{nameToBeReplaced}占位符为张三的歌
String[] beanNames = beanFactory.getBeanDefinitionNames();
for (String beanName : beanNames) {
BeanDefinition beanDefinition
= beanFactory.getBeanDefinition(beanName);
//this.printBeanDef(beanName, beanDefinition);
if ("myBeanFactoryProcessorTestBean".equalsIgnoreCase(beanName)) {
MutablePropertyValues propertyValues = beanDefinition.getPropertyValues();
String propertyName = "name";
PropertyValue namePv = propertyValues.getPropertyValue(propertyName);
String nameValAfterReplace
= ((TypedStringValue)namePv.getValue()).getValue().replace("{nameToBeReplaced}", "张三的歌");
propertyValues.addPropertyValue(propertyName, nameValAfterReplace);
}
}
}
}
2.4: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="beanFactoryPostProcessor"
class="yudaosourcecode.studyhelp.MyBeanFactoryPostProcessor"/>
<bean id="myBeanFactoryProcessorTestBean"
class="yudaosourcecode.studyhelp.MyBeanFactoryProcessorTestBean">
<property name="name" value="姓名是{nameToBeReplaced}"/>
</bean>
</beans>
注意配置的name的值为姓名是{nameToBeReplaced}
,我们会替换{nameToBeReplaced}
为真实的值。
2.5:测试
@Test
publicvoid testmybeanfactorypostprocessor() {
ClassPathXmlApplicationContext ac
= new ClassPathXmlApplicationContext("testmybeanfactorypostprocessor.xml");
MyBeanFactoryProcessorTestBean myBeanFactoryProcessorTestBean = ac.getBean("myBeanFactoryProcessorTestBean",
MyBeanFactoryProcessorTestBean.class);
System.out.println("myBeanFactoryProcessorTestBean is: " +
myBeanFactoryProcessorTestBean);
}
运行:
myBeanFactoryProcessorTestBean is: {"name":"姓名是张三的歌"}
Process finished with exit code 0