spring BeanFactoryPostProcessor分析,带实例

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值