zoukankan      html  css  js  c++  java
  • 【spring源码分析】二、Spring扩展点的归总

    【spring源码分析】二、Spring扩展点的归总

    1 BeanDefinitionRegistryPostProcessor

    BeanDefinitionRegistryPostProcessor 
    实现该接口的类需要重写以下方法
    void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
    
    spring 中调用的时机:
    在 spring 初始化容器之后,解析Class 为一个BeanDefinition 之前的时候去执行,
    spring 中有一个开天辟地的类 ConfigurationClassPostProcessor 就是实现了该接口,
    ConfigurationClassPostProcessor 通过重写 这个方法,
    
    第一步:去扫描加了 @Configuration 注解的这些类,判断是否是AnnotatedBeanDefinition类型的,将这些类去打上 Lite/Full 的属性,以便后续使用
    
    第二步:去实现扫描basePackage下的加了 @Service @Controller @Component 的这些类
    将这些类变成为一个BeanDefinition 注册到 Spring 的BeanDefinitionMap中去
    
    第三步: 
    去解析 @import  
    实现 ImportSelector接口的 
    实现 ImportBeanDefinitionRegistrar 接口的 这些类的方法,将对应的bean 解析为BeanDefinition,注册到BeanDefinitionMap 中
     
    注意: 在新的Mybatis-spring 的框架中,也使用了到了这个接口
    MapperScannerConfigurer 这个扫描配置类 也实现了这个接口!
    重写了postProcessBeanDefinitionRegistry() 用于创建扫描器对象,去扫描mybatis 里的那些接口转化为BeanDefinition到容器中去
    
    作用: 
    有了参数  registry 的对象,就能手动向spring容器添加 自定义的BeanDefinition 
    registry  提供了 添加的 API,但是一般我们不调用
    

    2 BeanFactoryPostProcessor

    BeanFactoryPostProcessor 该接口是 BeanDefinitionRegistryPostProcessor的父接口,
    表示只要实现了上面1的接口的类,都必实现了这个接口
    实现该接口的类需要重写以下方法
    
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
    
    spring 中调用的时机:
    在执行完了子类重写的方法之后,也就是扫描了一圈BeanDefinition 之后去执行
    我们开天辟地的ConfigurationClassPostProcessor 类重写的 postProcessBeanFactory()方法里面干了这些事情
    
    标记为 Full 全配置类的 BeanDefinition 会在这边做神奇的事情
    我们的APPConfig 里面 会有 @Bean 返回 我们要创建的对象,但是spring是默认单例的
    那如果有 
    A(){
        B();
        return new A();
    }
    
    B(){
        return new B();
    }
    这种情况,spring就会使用ASM框架(Cglib动态代理)的方式去解决创建Bean的问题
    这里也是一个spring 里面 AOP 的具体实现,也是spring中循环注入的一个地方 
    
    
    作用:
    此时BeanDefinitionMap 中已经有了大部分Class对应 BeanDefinition了,
    我们就可以 通过 beanFactory.getBeanDefinition("在BDMap中的名字");来获取BeanDefinition,
    来设置这些BD属性
    
  • 相关阅读:
    遇到缺陷错误时,有耐心,冷静思考,保证大方向是正确的
    学习新芯片和做新的工作内容时 DEMO
    599密码
    shop--7.店铺编辑和列表--店铺管理 前端
    shop--7.店铺编辑和列表--店铺列表展示 前端
    shop--7.店铺编辑和列表--店铺列表 分页查询,模糊查询--service层,controller层实现
    shop--7.店铺编辑和列表--店铺列表 分页查询,模糊查询--dao层实现
    shop--7.店铺编辑和列表--更新店铺的信息 前端实现 js
    shop--7.店铺编辑和列表--更新店铺的信息,包括对店铺照片的处理,根据shopId获取shop信息
    shop--7.店铺编辑和列表--联合查询的结果集封装ResultMap association collection
  • 原文地址:https://www.cnblogs.com/faramita/p/14613330.html
Copyright © 2011-2022 走看看