zoukankan      html  css  js  c++  java
  • spring中几个比较重要的扩展点

    BeanFactoryPostProcessor

    实现该接口,可以在spring的bean创建之前,修改bean的定义属性。也就是说,Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据,并可以根据需要进行修改,例如可以把bean的scope从singleton改为prototype,也可以把property的值给修改掉。可以同时配置多个BeanFactoryPostProcessor,并通过设置'order'属性来控制各个BeanFactoryPostProcessor的执行次序。

    注意:BeanFactoryPostProcessor是在spring容器加载了bean的定义文件之后,在bean实例化之前执行的。

    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory);

    ————————————————

    原文链接:https://blog.csdn.net/caihaijiang/java/article/details/35552859

    Spring内部也是在这块对@Configuration配置类实现CGLIB代理的(ConfigurationClassPostProcessor#postProcessBeanFactory)

    BeanDefinitionRegistryPostProcessor

    该接口继承了BeanFactoryPostProcessor 接口。在所有bean定义信息将要被加载,bean实例还未创建的时候执行我们的扩展;从spring源码看它优先于BeanFactoryPostProcessor执行(先遍历了BeanDefinitionRegistryPostProcessor);利用BeanDefinitionRegistryPostProcessor给容器中再额外添加一些组件。

    Spring内部也是基于它实现的bean扫描注册。

    BeanFactoryPostProcessor可以修改各个Bean定义(BeanDefinition),BeanDefinitionRegistryPostProcessor可以动态地注册Bean。

    如下两个方法:

    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory);
    
    
    void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) ;
    BeanPostProcessor

    BeanPostProcessor,可以在spring容器实例化bean之后,在执行bean的初始化方法前后,添加一些自己的处理逻辑。这里说的初始化方法,指的是下面两种:

    1)bean实现了InitializingBean接口,对应的方法为afterPropertiesSet

    2)在bean定义的时候,通过init-method设置的方法

    注意:BeanPostProcessor是在spring容器加载了bean的定义文件并且实例化bean之后执行的。BeanPostProcessor的执行顺序是在BeanFactoryPostProcessor之后。

    ————————————————

    原文链接:https://blog.csdn.net/caihaijiang/java/article/details/35552859

    ImportSelector

    ImportSelector类只能通过@Import的方式来加载,通常是启动类或配置类。

    ImportSelector接口提供了一个selectImports方法,该方法将返回一个数组,也就是类实例名称。spring会把根据这些类名称创建bean定义,由于这个过程是spring内部帮我们做的,所以我们无法干涉这个bean定义的创建注册。

    具体应用可参见:https://www.cnblogs.com/tianboblog/p/12619262.html

    String[] selectImports(AnnotationMetadata importingClassMetadata);
    ImportBeanDefinitionRegistrar

    ImportBeanDefinitionRegistrar类只能通过其他类@Import的方式来加载,通常是启动类或配置类。

    其中比较典型的应用就是mybatis.spring中实现的@MapperScan注解。

    详见:https://www.cnblogs.com/tianboblog/p/12618057.html

    void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {}

    它相对于ImportSelector功能更强大,提供了registry,直接可以通过它进行bean注册。

  • 相关阅读:
    从一个故障说说Java的三个BlockingQueue
    kafka producer源码
    Mock方法介绍
    async4j 普通用法、整合spring用法
    Spring中属性文件properties的读取与使用
    异步框架asyn4j的原理
    如何从线程返回信息——轮询、回调、Callable
    jdk 1.8 Executors
    java Iterator Fail-fast机制
    java的几种对象(PO,VO,DAO,BO,POJO)解释
  • 原文地址:https://www.cnblogs.com/tianboblog/p/12625829.html
Copyright © 2011-2022 走看看