关于移除和修改Bean属性的思考

2022-07-07  本文已影响0人  小周爱吃瓜
Config xxx 工厂,修改   AAA
DefaultXXX 工厂 ,注册和移除BeanDefinition  

BeanFactoryPostProcessor

  1. BeanDefinitionRegistryPostProcessor

 @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        registry.removeBeanDefinition();
        registry.getBeanDefinition();

        registry.registerBeanDefinition();
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    }

ConfigurableListableBeanFactory是不能注册BeanDefinition的,只能获取BeanDefinition和修噶BeanDefinition. (修改的Bean工厂)

DefaultListableBeanFactory可以注册Bean.(注册的Bean工厂)

Screen Shot 2022-07-06 at 1.05.41 PM.png

DefaultListableBeanFactory:

针对的是Bean或者BeanDefinition

左侧是修改的功能,右侧是注册的功能

image.png
子类的BeanDefinitionRegistryPostProcessor比父类更加优先的执行,
并且具备removeBeanDefinition的功能,但是BeanFactoryPostProcessor只具备查找BeanDefinition的功能.  两者都可以对BeanDefinition
    static class CCC implements BeanDefinitionRegistryPostProcessor{
        //修改属性
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
            beanFactory.getBeanDefinitionCount();

            //可以获取信息
            BeanDefinition definition = beanFactory.getBeanDefinition("aaa");
//          beanFactory.re
//          definition.setAttribute();

            definition.setFactoryBeanName("aaa");

            //这里不用注册,因为还是浅拷贝
//          beanFactory.registerSingleton();
        }

        //删除Bean ,优先级高于postProcessBeanFactory
        @Override
        public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
            BeanDefinition beanDefinition = new RootBeanDefinition("aaa");
            registry.registerBeanDefinition("aaa",beanDefinition);
            registry.removeBeanDefinition("beanName");
        }
    }
上一篇下一篇

猜你喜欢

热点阅读