springboot1--自动配置原理

1、springboot优缺点

优点:—一站式快速开发脚手架
1)创建独立spring应用
2)内嵌web服务器
3)自动starter依赖,简化依赖
4)自动配置spring及第三方功能
5)强大的监控、健康检查
6)无xml配置
缺点:
迭代太快
封装太深

2、springboot特点

2.1依赖管理

  • 父项目做依赖管理
    几乎声明了所有开发中常用的依赖的版本号
    自动版本仲裁机制
依赖管理    
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
</parent>

他的父项目
 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.3.4.RELEASE</version>
  </parent>
  • 开发导入starter场景启动器
1、见到很多 spring-boot-starter-* : *就某种场景
2、只要引入starter,这个场景的所有常规需要的依赖我们都自动引入
3、SpringBoot所有支持的场景
https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter
4、见到的  *-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器。
5、所有场景启动器最底层的依赖
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
  <version>2.3.4.RELEASE</version>
  <scope>compile</scope>
</dependency>

2.2自动配置

1) 自动配好Tomcat

  • 引入Tomcat依赖。
  • 配置Tomcat

2) 自动配好SpringMVC

  • 引入SpringMVC全套组件
  • 自动配好SpringMVC常用组件(功能)

3) 自动配好Web常见功能

  • SpringBoot帮我们配置好了所有web开发的常见场景
    如:字符编码问题(characEncodeFilter)、上传文件解析器等

4)默认的包结构

  • 主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来
  • 无需以前的包扫描配置
  • 想要改变扫描路径,@SpringBootApplication(scanBasePackages=“com.atguigu”)
    或者@ComponentScan 指定扫描路径
@SpringBootApplication
等同于
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.atguigu.boot")

5)各种配置拥有默认值

  • 默认配置最终都是映射到某个类上,如:MultipartProperties
  • 配置文件的值最终会绑定每个类上,这个类会在容器中创建对象

6)按需加载所有自动配置项

  • 非常多的starter
  • 引入了哪些场景这个场景的自动配置才会开启
  • SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面

3、自动配置原理流程解析

3.1、引导加载自动配置类

@SpringBootConfiguration  //@Configuration。代表当前是一个配置类
@ComponentScan
@EnableAutoConfiguration //核心
	@AutoConfigurationPackage
	@Import(AutoConfigurationImportSelector.class)
	public @interface EnableAutoConfiguration {}
	@Import(AutoConfigurationPackages.Registrar.class)  //给容器中导入一个组件
	public @interface AutoConfigurationPackage {}
	//利用Registrar给容器中导入一系列组件
	//将指定的一个包下的所有组件导入进来?MainApplication 所在包下。
1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
2、调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
4、从META-INF/spring.factories位置来加载一个文件。
    默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
    spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories

3.2、按需开启自动配置项

虽然127个场景的所有自动配置xxxxAutoConfiguration启动的时候默认全部加载。
按照条件装配规则(@Conditional),最终会按需配置。
多个@Conditionaltrue才生效

3.3、修改默认配置

给容器中加入了文件上传解析器;
我们可以自己指定multipartResolver ,就算写不同的名字,容器也能找到。
这里就牵涉到我们修改默认配置的两种方式。
1)一是重写一个bean,在bean里写新的属性和方法
2)二十在application配置文件中修改对象的配置。

		@Bean
        @ConditionalOnBean(MultipartResolver.class)  //容器中有这个类型组件
        //容器中没有这个名字 multipartResolver 的组件
        @ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) 
        public MultipartResolver multipartResolver(MultipartResolver resolver) {
            //给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。
            //SpringMVC multipartResolver。防止有些用户配置的文件上传解析器不符合规范
            // Detect if the user has created a MultipartResolver but named it incorrectly
            return resolver;
        }

3.4 总结

1) SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
2) 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
xxxxxAutoConfiguration —> 组件(比如dispatchServlet) —> xxxxProperties里面拿值 ----> application.properties
可以根据conditional里的条件,判断某个组件没有加载的原因。或者开启debug=true
3) 生效的配置类就会给容器中装配很多组件
4) 只要容器中有这些组件,相当于这些功能就有了
5)定制化配置
A、用户直接自己@Bean替换底层的组件
B、用户去看这个组件是获取的配置文件什么值就去修改
所以想要修改某个配置,就改 application.properties,怎么知道约定的配置名称叫什么呢?----查官方文档;或者看源码里面对应的xxxProperties类

4、配置文件里的对象属性自动装配成bean

@EnableConfigurationProperties注解的作用是:使使用 @ConfigurationProperties 注解的类生效。
@ConfigurationProperties 的作用是将指定的配置绑定在当前类的bean之上。
如下面的例子,如果不加@Component,这个类不会生效,加了之后才会注册到容器中。所以:
激活配置文件实体类的三种方式
1)@EnableConfigurationProperties
2)@ComponentScan +@Component
3)利用javaconfig,在另一个configration配置类中,@Bean,然后new出HelloServiceProperties

@ConfigurationProperties(prefix = "service.properties")
@Component
public class HelloServiceProperties {
    private static final String SERVICE_NAME = "test-service";

    private String msg = SERVICE_NAME;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值