• SpringBoot SpringBoot 原理篇 1 自动配置 1.9 bean 的加载方式【七】


    SpringBoot

    【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】

    SpringBoot 原理篇

    1 自动配置

    1.9 bean 的加载方式【七】
    1.9.1 ImportBeanDefinitionRegistrar

    之前我们又讲了第六种 ImportSelector ,通过实现这个接口去查某一个东西的“户口”

    在这里插入图片描述

    现在来说说第七种,这种方式又要复杂一些,高端一些

    【直接开干】

    来一个新的类

    package com.dingjiaxiong.bean;
    
    import org.springframework.beans.factory.support.BeanDefinitionRegistry;
    import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
    import org.springframework.core.type.AnnotationMetadata;
    
    /**
     * ClassName: MyRegistrar
     * date: 2022/10/24 16:24
     *
     * @author DingJiaxiong
     */
    
    
    public class MyRegistrar implements ImportBeanDefinitionRegistrar {
    
    
        //第一个参数就是我们之前看的元数据,而且他还有一个参数,也就是这种方式比第六种更强大
        @Override
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    以前我们第六种的时候

    返回

    在这里插入图片描述

    是用的全路径类名

    第七种方式就不用了,靠的就是registry 这个对象来帮我们初始化bean

    package com.dingjiaxiong.bean;
    
    import org.springframework.beans.factory.config.BeanDefinition;
    import org.springframework.beans.factory.support.BeanDefinitionBuilder;
    import org.springframework.beans.factory.support.BeanDefinitionRegistry;
    import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
    import org.springframework.core.type.AnnotationMetadata;
    
    /**
     * ClassName: MyRegistrar
     * date: 2022/10/24 16:24
     *
     * @author DingJiaxiong
     */
    
    
    public class MyRegistrar implements ImportBeanDefinitionRegistrar {
    
    
        //第一个参数就是我们之前看的元数据,而且他还有一个参数,也就是这种方式比第六种更强大
        @Override
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    
            //1. 使用元数据进行判定【这里就不判了】
            //初始化BeanDefinition对象
            BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Dog.class).getBeanDefinition();
    
            registry.registerBeanDefinition("yellow",beanDefinition);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    OK,再来一个配置类

    package com.dingjiaxiong.config;
    
    import com.dingjiaxiong.bean.MyImportSelector;
    import com.dingjiaxiong.bean.MyRegistrar;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Import;
    
    /**
     * ClassName: SpringConfig7
     * date: 2022/10/24 14:52
     *
     * @author DingJiaxiong
     */
    
    
    @Import(MyRegistrar.class)
    public class SpringConfig7 {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    OK。来一个运行类

    package com.dingjiaxiong.app;
    
    import com.dingjiaxiong.config.SpringConfig6;
    import com.dingjiaxiong.config.SpringConfig7;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    /**
     * ClassName: App7
     * date: 2022/10/24 13:42
     *
     * @author DingJiaxiong
     */
    
    public class App7 {
    
        public static void main(String[] args) {
    
            ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig7.class);
    
            String[] names = ctx.getBeanDefinitionNames();
            for (String name : names) {
                System.out.println(name);
            }
            System.out.println("=========================");
    
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    直接运行

    在这里插入图片描述

    我超,出来了【这就又实现了对bean 的管理,更高端牛逼了】

    OK,回顾一下

    导入实现了ImportBeanDefinitionRegistrar接口的类,通过BeanDefinition的注册器注册实名bean,实现对
    容器中bean的裁定,例如对现有bean的覆盖,进而达成不修改源代码的情况下更换实现的效果

    在这里插入图片描述

  • 相关阅读:
    激活函数总结(四十二):激活函数补充(SSFG、Gumbel Cross Entropy)
    使用python量化交易接口有哪些分析指标和策略?
    Gitlab的安装与配置
    力扣labuladong一刷day3共4题
    线性dp,271. 杨老师的照相排列
    typescript ts 基础知识之接口、泛型
    【数据结构】链表经典oj
    散列表(1)-集合/用位向量实现集合
    Maxwell 概述、安装、数据同步【一篇搞定】!
    vue3 的 ref、isRef、toRef、toRefs、toRaw 详细介绍
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/128048750