拦截Bean使用之前各个时机的Spring组件

拦截Bean使用之前各个时机的Spring组件

  • 之前使用过的BeanPostProcessor就是在Bean实例化之后,注入属性值之前的时机。
    Spring Bean的生命周期
  • 本次演示的是在Bean实例化之前的时机,使用BeanFactoryPostProcessor进行验证,以及在加载Bean之前进行拦截的,BeanDefinitionRegistryProcessor

Bean被使用前的时机

声明、解析、实例化、注入属性值

拦截Bean使用之前各个时机的Spring组件_第1张图片

解析Bean前——BeanDefinitionRegistryPostProcessor

/**
 * 在解析Bean之前对容器的信息进行拦截
 */
@Component
public class TestBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {

    /**
     * 执行加载Bean之前
     */
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        // 可以手动的给容器注册Bean
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(Banana.class);
        AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
        registry.registerBeanDefinition("myOrange", beanDefinition);
    }

    /**
     * 执行加载Bean之后
     */
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("BeanDefinitionRegistryPostProcessor: " + beanFactory.getBean("myOrange", Banana.class));
    }
}

实例化Bean前——BeanFactoryPostProcessor

/**
 * 在给每一个Bean实例化之前,获取该容器
 */
@Component
public class TestBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        // 根据name 获取相应的Bean对象
        // BeanDefinition beanDefinition = beanFactory.getBeanDefinition("");

        // 获取容器中bean的个数
//        int beanDefinitionCount = beanFactory.getBeanDefinitionCount();
//        System.out.println("beanDefinitionCount:" + beanDefinitionCount);
        // 获取已经实例化的Bean
//        String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
//        for (String beanDefinitionName : beanDefinitionNames) {
//            System.out.println(beanDefinitionName);
//        }
        // 获取当前时机之前使用过的拦截器
//        BeanFactory parentBeanFactory = beanFactory.getParentBeanFactory();
//        System.out.println("BeanFactoryPostProcessor ParentFactory: " + parentBeanFactory);
        System.out.println("BeanFactoryPostProcessor: " + beanFactory.getBean("myOrange", Banana.class));
    }
}

测试代码

public static void configContext() {
        AnnotationConfigApplicationContext configContext = new AnnotationConfigApplicationContext();
        // 测试BeanDefinitionRegistryPostProcessor
        configContext.register(BeanConfiguration.class);
        configContext.refresh();
        System.out.println("configContext: " + configContext.getBean("myOrange", Banana.class));

    }

配置类

@Configuration
@Import({TestBeanDefinitionRegistryPostProcessor.class, TestBeanFactoryPostProcessor.class })
public class BeanConfiguration {
}

结果

在这里插入图片描述

你可能感兴趣的:(Spring,spring,java,后端)