SpringBoot3-深入理解自动配置类的原理(尚硅谷SpringBoot3-雷神)


目录

什么是自动配置类:简单的进行分析就是自动的将你需要的类或者jar包进行导入,无需自己配置,而在springBoot中就很好的实现了此功能,我们再写springBoot时一般只需要四步:
1、导入对应场景的Mean依赖
2、编写主程序:@SpringBootApplication
3、xxxxAutoConfiguration自动配置类
4、编写具体的业务代码…

了解自动配置

1、包扫描规则
在springBoot中约定,默认包扫描规则为:只会扫描在主程序(也就是@SpringBootApplication 所标记的类)所在的包及其子包的所有文件,【当然也是可以进行自定义范围的,但是springBoot约定是如此,没有什么特殊要求以约定为准】
2、配置的默认值
在springBoot中,若是在配置文件中的属性都与配置类中的对象一一对应(这时也称此类为属性类),这时只要在配置文件(application.properties/yml/xml)设置了某一个属性的值,此时这个属性的配置类对象的默认值就是对应当前在配置文件中所设置的属性值。
类如我在配置文件中设置了server.port = 8888,此时所对应的**属性类(ServerProperties)**中的对象port就变成了8888,[原理就是调用了ServerProperties中的setPort方法],配置文件中没有写的属性类中的对象,则以SpringBoot官方所约定默认值为准
3、按需加载配置
虽然在spring-boot-dependencies包中有所有场景的配置,但是只有导入对应的场景才会导入对应场景所需要的配置,并不是全部导入。

一、导入对应场景的Mean依赖:

1、引入依赖

这里以javaweb演示:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

找到自动配置类的所有配置都存放在哪里

步骤:
1:找到spring-boot-starter文件(此文件是所有的场景① 所需要依赖的核心场景启动器
2、核心场景启动器引入了spring-boot-autoconfigure包。
3、找到spring-boot-autoconfigure②,所在的jar包位置
:场景是什么:以web场景举例,假设你需要进行编写web项目,在SSM中需要进行导入许多的依赖,而在这里你只需要进行导入web场景,则会直接进行导入这个场景所需要的所有依赖】
:此spring-boot-autoconfigure包中就存放了所有配置类。也就是说只要此包可以生效,即SpringBoot官方写好的整合功能就生效了。
图示:在这里插入图片描述

题外话(依赖管理):为什么没有标记版本号

首先进行观察此依赖会发现并没有写web的版本号,肯定会有人问为什么可以不写,我们可以看到pom.xml文件顶部的<artifactId>spring-boot-starter-parent</artifactId>这串代码可以说明此文件的依赖于spring-boot-starter-parent pom文件,点进去之后又可以看到此依赖又依赖了<artifactId>spring-boot-dependencies</artifactId>,在点进去之后往下滑就可以看到了许多的<XXX.version>…此文件就是进行约定了依赖的版本(注意这里只约定了官方所提供的依赖,而第三方的依赖并没有进行约定)
简单来说:yourPom --(依赖于)–> spring-boot-starter-paren --(依赖于)–> spring-boot-dependencies [而在此pom文件就有约定官方所提供的依赖版本]
图示:
1、你的mean依赖文件:
在这里插入图片描述
2、进入到spring-boot-starter-paren文件:
在这里插入图片描述
3、进入到spring-boot-dependencies文件:在这里插入图片描述

二、编写主程序:@SpringBootApplication

观察源码时所需要知道的几个核心注解:

  1. @Configuration、@SpringBootConfiguration
    - 这两个注解都是将类标识为配置类(所以本质上并没有区别),从而替代了spring的配置xml文件
  2. @Bean、@Scope
    - ①:@Bean:替代了Bean标签
    - ②:@Scope:将bean对象转换为(单实例/多实例)

1和2一般是搭配使用,代码演示:
(这里的实体类代码就不写了,你们可以自己随便写几个实体类进行测试)

配置类代码:

@Configuration//标记为配置类,替代spring配置xml文件
//@SpringBootConfiguration//标记为springBoot的配置类,替代spring配置xml文件
public class configClass1 {
   	@Bean("user001")//替代了Bean标签,默认方法名就是bean对象的name,也可以直接在注解中设置name
    public user user(){
    	//这里就是创建bean对象,user为你创建实体类
        user user = new user();
        user.setName("张三");
        user.setAge(31);
        user.setGender("男");
        return user;
    }
}

在spring中创建bean并完成上述的所有操作:
在这里插入图片描述

测试(主程序代码):

@SpringBootApplication
public class Boot3Demo2Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext ioc = SpringApplication.run(Boot3Demo2Application.class, args);

        /*输出所有ioc容器中所有bean对象name*/
        for (String name : ioc.getBeanDefinitionNames()) {
            System.out.println(name);
        }
        /*以user类型查询所有的bean对象*/
        String[] forType = ioc.getBeanNamesForType(user.class);
        for (String s : forType) {
            System.out.println(s);
        }

        /*判断这两个的指定的对象是否相同(也就可以证明是否是单实例)*/
        Object user1 = ioc.getBean("user001");
        Object user2 = ioc.getBean("user001");
        //若是为false则为多实列,若为true则为单实列
        System.out.println(user1 == user2);
    }

}

执行结果如下图:
在这里插入图片描述

  • @Import
    • 它也可可以创建bean对象,只需要在配置类上面进行标记即可
@Import(FastsqlException.class)//bean对象name默认为全类名
@Configuration//标记为配置类
public class configClass1 {}

条件注解:

  • @ConditionalOnClass:如果类路径中存在这个类,则触发指定行为
  • @ConditionalOnMissingClass:如果类路径中不存在这个类,则触发指定行为
  • @ConditionalOnBean:如果容器中存在这个Bean(组件),则触发指定行为
  • @ConditionalOnMissingBean:如果容器中不存在这个Bean(组件),则触发指定行为

这几个注解只需要知道什么意思即可,所以就不演示了

属性绑定:

属性绑定就是将创建的bean对象,与配置文件中的属性进行绑定
@ConfigurationProperties
将配置文件中以特定值为前缀的进行与当前标记的类进行绑定(前提是此类必须在容器中)
@EnableConfigurationProperties
标记在配置类中
1.开启pig的属性绑定功能、2.将pig放到ioc容器中
用法如图:
在这里插入图片描述

1、观察@SpringBootApplication源码都做了什么

在**@SpringBootApplication**中是由三个注解组成的:
1、@SpringBootConfiguration :标记为springBoot配置类
2、@ComponentScan:包扫描的注解

3、@EnableAutoConfiguration:用来自动配置的注解
1、首先查看@EnableAutoConfiguration的源码(在SpringBootApplication里面中标记它的注解)
2、在此注解@EnableAutoConfiguration上有着一个@Import,它导入了一个类:{AutoConfigurationImportSelector.class},进入到里面,并找到一个方法,其方法名为:getAutoConfigurationEntry,在这两处进行断点查看:
在这里插入图片描述
3、跳过第一个断点查看属性configurations
会发现加载了许多的配置类,而这些就是我们所需的配置。
在这里插入图片描述
4、那这些配置类从哪里来的?
其实就是从我们上面所说的spring-boot-dependencies包
可以直接找到方法:getCandidateConfigurations,如图:
在这里插入图片描述
在找到autoConfigurationAnnotation并查找此类的全类名:
在这里插入图片描述
此时就可以得知这个jar包的路径为:
META-INF/spring/org.springframework.boot.autoconfigure.imports
这个路径需要再library中进行查找:
在这里插入图片描述
此时就可以知道springBoot是如何进行有效的导入配置。

三、xxxxAutoConfiguration自动配置类

打开存放配置路径的文件(也就是上面最后所打开的文件):在此文件中可以发现,许多的xxxxAutoConfiguration自动配置类,我们可以任意的查看自动配置类可以发现有许多的@Bean注解。
由此可以说明:使用@Bean 在IOC容器中存放了一堆组件

我们可以先打开EmbeddedWebServerFactoryCustomizerAutoConfiguration自动配置类观察一下,看到tomcatWebServerFactoryCustomizer(翻译;TomcatWeb服务器工厂定制器)方法中的返回值:serverProperties(服务器属性)
在这里插入图片描述
我们可以直接进入到此类中,可以发现此类就是一个属性类,且还可以发现一个规律就是所有以XXXProperties结尾的都是一个属性类。

我们可以在EmbeddedWebServerFactoryCustomizerAutoConfiguration类中查看注解,会发现一个我们上面所说的注解:@EnableConfigurationProperties({ServerProperties.class}),
作用:
1、开启ServerProperties类的属性绑定功能
2、将ServerProperties放到ioc容器中
由此可以推断:每个自动配置类都可能有这个注解@EnableConfigurationProperties(XXXProperties.class),用来把配置文件中指定前缀的属性值封装到 xxxProperties属性类中
这里要是没找到的话可以带开这几个自动配置类
ReactiveMultipartAutoConfigurationHttpEncodingAutoConfigurationThymeleafAutoConfiguration…都可以找到EnableConfigurationProperties注解,且都将属性类作为参数

由上面的内容就可以进行推断:
IOC容器中放的所有组件(就是在自动配置类中所标记@Bean的方法) 的一些 核心参数(就是我们在配置文件中可以修改的属性例如:端口),都来自于xxxProperties。
xxxProperties都是和配置文件绑定
此时:只需要改配置文件的值,核心组件的底层参数都能修改

四、编写主程序:@SpringBootApplication

到这里就已经完成了自动装配等事情…


以上是我看尚硅谷SpringBoot3-雷神,在加上自己的一些理解而写的,要是理解的话可以看此视频进行更深入的理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值