SpringBoot SpringBoot 原理篇 1 自动配置 1.8 bean 的加载方式【六】

news2025/3/1 13:47:30

SpringBoot

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

SpringBoot 原理篇

文章目录

      • SpringBoot
      • SpringBoot 原理篇
      • 1 自动配置
        • 1.8 bean 的加载方式【六】
          • 1.8.1 ImportSelector

1 自动配置

1.8 bean 的加载方式【六】

1.8.1 ImportSelector

OK,上一节又说完了第五种

使用上下文对象在容器初始化完毕后注入bean

在这里插入图片描述

下面就来说说第六种

第六种方式平时咱们自己用的少,但是在框架内部大量使用

先来一个全新的类

package com.dingjiaxiong.bean;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

/**
 * ClassName: MyImportSelector
 * date: 2022/10/24 15:39
 *
 * @author DingJiaxiong
 */

public class MyImportSelector implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.dingjiaxiong.bean.Dog"};
    }
}

数组中是要加载bean 的全路径名

再来一个新的配置类

package com.dingjiaxiong.config;

import com.dingjiaxiong.bean.Dog;
import com.dingjiaxiong.bean.MyImportSelector;
import org.springframework.context.annotation.Import;

/**
 * ClassName: SpringConfig6
 * date: 2022/10/24 14:52
 *
 * @author DingJiaxiong
 */

@Import(MyImportSelector.class)
public class SpringConfig6 {
}

最后来个运行类

package com.dingjiaxiong.app;

import com.dingjiaxiong.bean.Cat;
import com.dingjiaxiong.bean.Mouse;
import com.dingjiaxiong.config.SpringConfig4;
import com.dingjiaxiong.config.SpringConfig6;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * ClassName: App6
 * date: 2022/10/24 13:42
 *
 * @author DingJiaxiong
 */

public class App6 {

    public static void main(String[] args) {

        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig6.class);

        String[] names = ctx.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
        System.out.println("=========================");

    }

}

OK,直接运行

在这里插入图片描述

OK, 效果很明显,已经上来了

还可以写多个

在这里插入图片描述

没毛病

加载就是这样了,难免会有人想问,为嘛要折腾这?

这种方式的关键

在这里插入图片描述

在于这个东西

Metadata 元数据:

举个例子,我们造了一个数据库、表,表里面有数据,那么这个数据表的信息在哪儿描述?

还得有另外一张表来描述这张表的结构,那这另外这张表就可以称为被描述表的元数据

还可以有元元数据、元元元数据…【数据库中有四层】

在我们这儿,元数据就是往上追溯一下

【这个东西有什么用?】

修改一下

package com.dingjiaxiong.bean;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

/**
 * ClassName: MyImportSelector
 * date: 2022/10/24 15:39
 *
 * @author DingJiaxiong
 */

public class MyImportSelector implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {

        System.out.println(importingClassMetadata.getClassName());

        return new String[]{"com.dingjiaxiong.bean.Dog"};
    }
}

先拿个classname 看看

在这里插入图片描述

意思就是 importingClassMetadata 这个形参描述的是 SpringConfig6

简单的说,

在这里插入图片描述

加载的是谁,描述的就是谁

再来

System.out.println(importingClassMetadata.hasAnnotation("org.springframework.context.annotation.Configuration"));

这个意思就是描述的那个东西上面有没有Configuration 注解

直接看看

在这里插入图片描述

如果我注掉

在这里插入图片描述

这样就false了

所以现在就可以明确了 importingClassMetadata 这个指的就是它那个类出现在谁上面

在这里插入图片描述

意思就是SpringConfig6 就是它对应的元数据

再来一个

在这里插入图片描述

现在我想知道,它有没有加basePackages 这个属性

package com.dingjiaxiong.bean;

import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

import java.util.Map;

/**
 * ClassName: MyImportSelector
 * date: 2022/10/24 15:39
 *
 * @author DingJiaxiong
 */

public class MyImportSelector implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {

        System.out.println("===========================");

        System.out.println(importingClassMetadata.getClassName());
        System.out.println(importingClassMetadata.hasAnnotation("org.springframework.context.annotation.Configuration"));
        Map<String, Object> attributes = importingClassMetadata.getAnnotationAttributes("org.springframework.context.annotation.ComponentScan");

        System.out.println(attributes);
        
        System.out.println("===========================");
        return new String[]{"com.dingjiaxiong.bean.Dog"};
    }
}

OK,直接运行

在这里插入图片描述

OK, 没啥毛病

到现在大概就知道了,我们可以利用这个东西去做一系列的判定,ImportSelector 的意义就在于我们可以进行各种条件的判定,判定完毕后,决定是否装载指定的bean

举个栗子

package com.dingjiaxiong.bean;

import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

import java.util.Map;

/**
 * ClassName: MyImportSelector
 * date: 2022/10/24 15:39
 *
 * @author DingJiaxiong
 */

public class MyImportSelector implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {

        boolean flag = importingClassMetadata.hasAnnotation("org.springframework.context.annotation.Configuration");
        if (flag){
            return new String[]{"com.dingjiaxiong.bean.Dog"};
        }
        return new String[]{"com.dingjiaxiong.bean.Cat"};
    }
}

判定运行结果

在这里插入图片描述

就是这样,意思就是这个东西不仅能够加载bean,它还可以进行条件判定、然后控制加载谁

OK,回顾一下

导入实现了ImportSelector接口的类,实现对导入源的编程式处理

在这里插入图片描述

相当于现在谁导入这个类,它就可以查谁的户口

SpringConfig6 导入了它,它就可以查SpringConfig6 的户口

在这里插入图片描述

OK

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

改进牛顿法潮流计算IEEE33节点潮流计算matlab程序——

IEEE33节点潮流计算matlab程序——改进牛顿法潮流计算 改进牛顿法的基本原理 参考文献&#xff1a;一种新的配电网潮流算法——改进牛顿法-拉夫逊法 牛顿法是改进牛顿法的基础&#xff0c;对牛顿法作科学的近似&#xff0c;即雅可比矩阵做一些更改&#xff0c;使得每次计算得…

stm32项目平衡车详解(stm32F407)下

stm32项目平衡车详解(stm32F407)下 HC-SRO4 超声波测距避障功能开发 TSL1401 CCD摄像头实现小车巡线功能 文章目录stm32项目平衡车详解(stm32F407)下前言一、HC-SRO4 超声波测距避障功能开发HC-SRO4超声波测距模块&#xff1f;超声波测距避障功能开发避障模式开发二、TSL1401 …

【微软】【ICLR 2022】TAPEX:通过学习神经 SQL 执行器进行表预训练

重磅推荐专栏&#xff1a; 《Transformers自然语言处理系列教程》 手把手带你深入实践Transformers&#xff0c;轻松构建属于自己的NLP智能应用&#xff01; 论文&#xff1a;https://arxiv.org/abs/2107.07653 代码&#xff1a;https://github.com/microsoft/Table-Pretrainin…

数字图像处理(十五)图像旋转

文章目录前言一、图像旋转算法1.算法原理2. 一些需要注意的点3.举例4. 均值插值法二、编程实现1.C代码2.实验结果参考资料前言 图像的旋转是指以图像中的某一点为原点以逆时针或者顺时针方向旋转一定的角度。通常是绕图像的起始点以逆时针进行旋转。 一、图像旋转算法 1.算法原…

JAVA并发之谈谈你对AQS的理解

文章目录一、AQS是什么二、AQS具备哪些特性三、用的哪种设计模式四、AQS与锁二者之间的关系五、如何基于AQS实现一把独占锁六、参考资料一、AQS是什么 AQS的全称是 &#xff08;AbstractQueuedSynchronizer &#xff09;&#xff0c;它定义了一套多线程访问共享资源的同步器框架…

【算法基础】(一)基础算法 --- 归并排序

✨个人主页&#xff1a;bit me ✨当前专栏&#xff1a;算法基础 &#x1f525;专栏简介&#xff1a;该专栏主要更新一些基础算法题&#xff0c;有参加蓝桥杯等算法题竞赛或者正在刷题的铁汁们可以关注一下&#x1f339; &#x1f339; &#x1f339; 归并排序&#x1f4a4;一.归…

猴子也能学会的jQuery第十期——jQuery元素操作(上)

&#x1f4da;系列文章—目录&#x1f525; 猴子也能学会的jQuery第一期——什么是jQuery 猴子也能学会的jQuery第二期——引用jQuery 猴子也能学会的jQuery第三期——使用jQuery 猴子也能学会的jQuery第四期——jQuery选择器大全 猴子也能学会的jQuery第五期——jQuery样式操作…

基于拟蒙特卡洛模拟法的随机潮流计算matlab程序

电力系统随机潮流计算中常采用模拟法&#xff0c;该方法原理简单、使用方便&#xff0c;能够精确地模拟实际物理过程&#xff0c;但是简单的蒙特卡洛模拟法收敛速度很慢&#xff0c;要得到精确的结果需要以大量的计算时间为代价。本章在此基础上提出了基于拟蒙特卡洛模拟的随机…

【菜菜的sklearn课堂笔记】逻辑回归与评分卡-用逻辑回归制作评分卡-异常值和样本不均衡处理

视频作者&#xff1a;菜菜TsaiTsai 链接&#xff1a;【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili 描述性统计处理异常值 现实数据永远都会有一些异常值&#xff0c;首先我们要去把他们捕捉出来&#xff0c;然后观察他们的性质。注意&#xff0c…

【雷达检测】基于复杂环境下的雷达目标检测技术附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

3.6、媒体接入控制

1、基本概念 有多台主机连接到这根同轴电缆上&#xff0c;共享这跟传输媒体&#xff0c;形成了总线型的局域网。 各主机竞争使用总线&#xff0c;随机的在信道发送数据。 主机 C 与主机 D 同时使用总线来发送数据&#xff0c;这必然会产生所发送信号的碰撞 2、静态划分信道…

二阶锥松弛在配电网最优潮流计算中的应用(IEEE33节点配电网最优潮流算例matlab程序)(yalmip+cplex)

二阶锥规划在配电网最优潮流计算中的应用IEEE33节点配电网最优潮流算例matlab程序&#xff08;yalmipcplex&#xff09; 参考文献&#xff1a;二阶锥规划在配电网最优潮流计算中的应用 最优潮流计算是电网规划、优化运行的重要基础。首先建立了配电网全天有功损耗最小化的最优…

ABAP学习笔记之——第四章:模块化程序

一、子程序&#xff1a; 语法&#xff1a; 参数&#xff1a; 参数(Parameter)是指调用子程序时用于传入、传出的值。子程序中的参数与一般用 DATA语句定义的局部变量相同。调用子程序时使用的参数叫实参(Actual Parameter)&#xff0c;在子程序中使用的参数叫虚参(Formal Par…

nginx(六十八)http_proxy模块 nginx与上游的ssl握手

一 nginx作为客户端与上游的SSL/TLS握手 理解上&#xff1a; nginx作为客户端,此时类似浏览器的角色,发请求建立连接 nginx作为server端与下游进行SSL/TLS握手 ① nginx与后端选择什么样的协议 1&#xff09;如果nginx与上游是局域网内,一般通过http建立请求,不需要进行…

使用flv.js + websokect播放rtsp格式视频流

1.问题背景 在最近的项目中&#xff0c;涉及到海康接入的视频播放的问题&#xff0c;海康这边获取到的视频流是rtsp格式&#xff0c;web端目前没有直接可以播放的组件&#xff0c;于是最开始是后端处理了视频流&#xff0c;返回hls格式的m3u8地址&#xff0c;这样用videojs插件…

进程【JavaEE初阶】

目录 一、操作系统 二、进程 2.1 进程的概念 2.2 进程的管理 2.3 PCB 2.3.1 PCB里面的一些属性 2.3.2 进程的调度 2.3.3 进程的虚拟地址空间 2.3.4 进程间通信 一、操作系统 CPU、存储器、输入设备、输出设备&#xff0c;这些实物看得着摸得到的&#xff0c;都属于 …

web前端-javascript-switch条件分支语句(语法,执行流程,补充)

文章目录条件分支语句(switch 语句)1. 语法&#xff1b;2. 执行流程&#xff1a;2.1. 在执行时会依次将 case 后的条件表达式的值和 switch 后的条件表达式的值进行全等比较2.2. 如果比较结果为 true&#xff0c;则从当前 case 处开始执行代码2.3. 如果比较结果为 false&#x…

【知识网络分析】研究机构合作网络(co-investigator institution)

研究机构合作网络(co-investigator institution) 1 网络数据集读取2 网络最大子群数据获取与精简3 中心点指定网络半径子群获取4 节点中心度相关指标计算1 网络数据集读取 使用GC.networkCoInvestigatorInstitution()方法快速生成研究结构合作网络数据集,其中GC代表着读入p…

解析华为OSPF协议

文章目录 前言一、pandas是 目录 文章目录 OSPF基础 一、报文类型 二、LSA类型 三.LSA在各区域中传播的支持情况 四.邻居状态机 邻居关系 邻接关系 &#xff18;种状态机&#xff1a; OSPF报文认证 OSPF缺省路由 2.读入数据 总结 什么&#xff1f;二、使用步骤 1.引入库2.读入数…

卷积神经网络CNN各层基本知识

卷积神经网络 卷积神经网络(CNN)由输入层、卷积层、激活函数、池化层以及全连接层构成。 INPUT&#xff08;输入层&#xff09;-CONV&#xff08;卷积层&#xff09;-RELU&#xff08;激活函数&#xff09;-POOL&#xff08;池化层&#xff09;-FC&#xff08;全连接层&#…