SpringBoot SpringBoot 原理篇 1 自动配置 1.8 bean 的加载方式【六】
创始人
2024-02-18 10:31:08

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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {System.out.println("===========================");System.out.println(importingClassMetadata.getClassName());System.out.println(importingClassMetadata.hasAnnotation("org.springframework.context.annotation.Configuration"));Map 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 {@Overridepublic 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

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...