spring 容器的功能扩展4.postProcessBeanFactory

本文介绍如何使用Spring框架的BeanFactoryPostProcessor接口进行bean定义的后处理操作,通过示例展示了如何创建一个ObscenityRemovingBeanFactoryPostProcessor来过滤配置文件中的敏感词汇。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个功能在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=*******)

 

### 回答1: postprocessbeanfactorySpring框架中的一个接口,用于在BeanFactory加载完所有bean定义之后对其进行后处理。它可以让开发者在BeanFactory实例化bean之前或之后对bean进行一些自定义的操作,例如修改bean的属性值、添加新的bean定义等。通过实现postprocessbeanfactory接口,开发者可以在Spring框架中实现自己的扩展功能,从而更好地满足业务需求。 ### 回答2: postProcessBeanFactorySpring框架中的一个接口,用于在BeanFactory加载Bean定义之后,但在实例化和初始化Bean之前,对BeanFactory进行进一步的定制和操作。 可以通过实现postProcessBeanFactory接口来自定义对BeanFactory的后处理逻辑。通常情况下,可以在这个方法中添加自定义的BeanDefinition,或者修改已经存在的BeanDefinition。通过这种方式可以动态地向BeanFactory中添加新的Bean定义,或者修改已有Bean定义的属性值。 此外,还可以通过postProcessBeanFactory方法注册自定义的PropertyEditor,用于将字符串转换为特定的属性类型。PropertyEditor将在Bean实例化过程中,自动解析Bean中的属性值并进行相应的转换。这样,就可以自动将字符串类型的属性值转换为Java对象的属性值。 另外,还可以通过postProcessBeanFactory方法对BeanFactory进行进一步的配置,例如设置BeanFactory的自动装配策略、属性转换等。这些配置操作可以在Bean实例化和初始化之前完成,从而在整个容器中起到统一的作用。 总之,postProcessBeanFactory方法可以实现对BeanFactory的灵活定制和扩展。通过实现这个接口,可以动态地向容器中添加新的Bean定义,修改已有Bean定义的属性值,注册自定义的属性编辑器,甚至对BeanFactory进行进一步的配置。这样,可以更好地适应不同的业务需求,实现更多样化和灵活化的BeanFactory。 ### 回答3: postProcessBeanFactorySpring Framework中的一个接口,它可以用于在BeanFactory加载完Bean定义后,对BeanFactory进行一些后处理操作。具体来说,它是BeanFactoryPostProcessor接口的一个子接口。 在Spring的Bean生命周期中,BeanFactoryPostProcessor的作用是在BeanFactory实例化和配置所有的bean之后,但在bean实例化之前,允许对BeanFactory做一些额外的配置。这些配置可以包括添加新的Bean定义、移除不需要的Bean定义、修改Bean定义的属性值等。 postProcessBeanFactory接口的主要方法是postProcessBeanFactory(ConfigurableListableBeanFactory factory)。通过实现该方法,我们可以获取到BeanFactory的实例,并可以对其进行相应的操作。这个方法常被用于自定义的容器扩展,比如加载额外的Bean定义文件、注册自定义的BeanPostProcessor等。 在实际应用中,我们可以通过创建一个实现了postProcessBeanFactory接口的类,并将其交给Spring容器管理,从而实现对BeanFactory的后处理操作。例如,可以通过在postProcessBeanFactory方法中添加额外的Bean定义,来动态注册一些Bean;或者可以通过修改BeanFactory中的某个Bean定义的属性值,来实现对Bean的定制化配置。 总之,postProcessBeanFactory接口提供了一个很好的机制,允许我们在Spring容器加载完Bean定义后,对BeanFactory做进一步的处理操作,以满足一些特定需求。它是Spring框架非常重要的一环,也是我们在使用Spring时可以灵活发挥的一个扩展点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值