【WEEK9】 【DAY4】自动配置原理【中文版】

2024.4.25 Thursday

5.自动配置原理

5.1.配置文件到底能写什么,怎么写?

SpringBoot官方文档中有大量的配置,我们无法全部记住
在这里插入图片描述

5.2.分析自动配置原理

5.2.1.按如下步骤点击

5.2.1.1.src/main/java/com/p8/springboot02config/Springboot02ConfigApplication.java
5.2.1.2.@SpringBootApplication(line6)
5.2.1.3.@EnableAutoConfiguration(line56)自动导入配置
5.2.1.4.AutoConfigurationImportSelector(line84)选择进入AutoConfigurationImportSelector.java
5.2.1.5.getAutoConfigurationEntry(line101)
5.2.1.6.getCandidateConfigurations(line125)
5.2.1.7.getSpringFactoriesLoaderFactoryClass(line183)
5.2.1.8.EnableAutoConfiguration(line197)标注以下的所有类
5.2.1.9.loadFactoryNames(line183)该标注会加载配置
5.2.1.10.loadSpringFactories(line69)
5.2.1.11.loadSpringFactories(line72)
5.2.1.12.Enumeration urls = classLoader.getResources(“META-INF/spring.factories”);(line80)
遍历所有资源,指向了META-INF/spring.factories
5.2.1.13.将读取到的数据封装到Properties(line85)然后返回并使用
5.2.1.14.相当于被扫描到的包全都会被自动装配,最终指向的是配置文件
在这里插入图片描述

5.2.2.我们以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理

注:这个在教程中可以找到,但是在自己的spring.factories中无法找到,可能是版本不同导致的

package com.p8.springboot02config.pojo;

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.filter.OrderedCharacterEncodingFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;

//表示这是一个配置类,和以前编写的配置文件一样,也可以给容器中添加组件;
@Configuration

//自动配置属性
//启动指定类的ConfigurationProperties功能;
//进入这个HttpProperties查看,将配置文件中对应的值和HttpProperties绑定起来;
//并把HttpProperties加入到ioc容器中
@EnableConfigurationProperties({HttpProperties.class})

//Spring底层@Conditional注解
//根据不同的条件判断,如果满足指定的条件,整个配置类里面的配置就会生效;
//这里的意思就是判断当前应用是否是web应用,如果是,当前配置类生效
@ConditionalOnWebApplication(
        type = Type.SERVLET
)

//判断当前项目有没有这个类CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器;
@ConditionalOnClass({CharacterEncodingFilter.class})

//判断配置文件中是否存在某个配置:spring.http.encoding.enabled;
//如果不存在,判断也是成立的
//即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的;
@ConditionalOnProperty(
        prefix = "spring.http.encoding",
        value = {"enabled"},
        matchIfMissing = true
)

public class HttpEncodingAutoConfiguration {
    //他已经和SpringBoot的配置文件映射了
    private final Encoding properties;
    //只有一个有参构造器的情况下,参数的值就会从容器中拿
    public HttpEncodingAutoConfiguration(HttpProperties properties) {
        this.properties = properties.getEncoding();
    }

    //给容器中添加一个组件,这个组件的某些值需要从properties中获取
    @Bean
    @ConditionalOnMissingBean //判断容器没有这个组件?
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST));
        filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE));
        return filter;
    }
    //......
}

5.2.2.1.一句话总结 :根据当前不同的条件判断,决定这个配置类是否生效!

5.2.2.1.1.一但这个配置类生效;这个配置类就会给容器中添加各种组件;
5.2.2.1.2.这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;
5.2.2.1.3.所有在配置文件中能配置的属性都是在xxxxProperties类中封装着;
5.2.2.1.4.配置文件能配置什么就可以参照某个功能对应的这个属性类
5.2.2.1.5.

//从配置文件中获取指定的值和bean的属性进行绑定@ConfigurationProperties(prefix = "spring.http") public class HttpProperties {    // .....}

5.2.2.1.6.我们去配置文件里面试试前缀,看提示!
在这里插入图片描述

这就是自动装配的原理!

5.2.3.精髓

5.2.3.1.SpringBoot启动会加载大量的自动配置类
5.2.3.2.我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;
5.2.3.3.我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)
5.2.3.4.给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;
5.2.3.5.xxxxAutoConfigurartion:自动配置类;给容器中添加组件
5.2.3.6.xxxxProperties:封装配置文件中相关属性。

5.2.4.了解:@Conditional

5.2.4.1.了解完自动装配的原理后,我们来关注一个细节问题,自动配置类必须在一定的条件下才能生效
5.2.4.2.@Conditional派生注解(Spring注解版原生的@Conditional作用)
5.2.4.3.作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;

@Conditional扩展注解 作用(判断是否满足当前指定条件)
@ConditionalOnJava 系统的java版本是否符合要求
@ConditionalOnJava 容器中存在指定Bean ;
@ConditionalOnMissingBean 容器中不存在指定Bean ;
@ConditionalOnExpression 满足SpEL表达式指定
@ConditionalOnClass 系统中有指定的类
@ConditionalOnMissingClass 系统中没有指定的类
@ConditionalOnSingleCandidate 容器中只有一个指定的Bean ,或者这个Bean是首选Bean
@ConditionalOnProperty 系统中指定的属性是否有指定的值
@ConditionalOnResource 类路径下是否存在指定资源文件
@ConditionalOnWebApplication 当前是web环境
@ConditionalOnNotWebApplication 当前不是web环境
@ConditionalOnJndi JNDI存在指定项

5.2.4.4.那么多的自动配置类,必须在一定的条件下才能生效;也就是说,我们加载了这么多的配置类,但不是所有的都生效了。
我们怎么知道哪些自动配置类生效?
5.2.4.5.我们可以通过启用 debug=true属性;来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效;

#开启springboot的调试类
debug=true

5.2.4.6.Positive matches:(自动配置类启用的:正匹配)
5.2.4.7.Negative matches:(没有启动,没有匹配成功的自动配置类:负匹配)
5.2.4.8.Unconditional classes: (没有条件的类)
5.2.4.9.【演示:查看输出的日志】
5.2.4.10.掌握吸收理解原理,即可以不变应万变!

5.2.5.修改application.yaml,重新运行Springboot02ConfigApplication

#配置文件到底能写什么?
#和spring.factories之间的联系
#spring:
#  mvc:
#    date-format:该方法已过时,本来可以点击date-format查看详情,现在不可以了
debug: true

可以在Console栏中的CONDITIONS EVALUATION REPORT相关提示中看到Positive matches相关内容指的是生效的,Negative matches相关内容不生效

6.Spring Boot:Web开发探究

6.1.思考:springboot帮我们配置了什么?我们能不能进行修改?能修改哪些东西?能不能扩展?

6.1.1.经常存在如下文件名
6.1.1.1.XxxxAutoConfiguration:向容器中自动配置组件(可能由于条件不满足而被屏蔽)
6.1.1.2.XxxxProperties:自动配置类,装配配置文件中自定义的内容
6.1.2.要解决的问题
6.1.2.1.导入静态资源
6.1.2.2.书写首页
6.1.2.3.没有jsp->改为使用模板引擎Thymeleaf
6.1.2.4.装配扩展SpringMVC
6.1.2.5.增删改查
6.1.2.6.拦截器
6.1.2.7.国际化(中英文)

相关推荐

  1. WEEK9】学习目标及总结【Spring Boot】【中文版

    2024-04-28 01:32:01       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-28 01:32:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-28 01:32:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-28 01:32:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-28 01:32:01       20 阅读

热门阅读

  1. C#面:泛型有哪些常见约束

    2024-04-28 01:32:01       15 阅读
  2. Oracle知识点Day05

    2024-04-28 01:32:01       13 阅读
  3. docker安装nacos

    2024-04-28 01:32:01       17 阅读
  4. 主控制文件(项目的开始)食用顺序_3

    2024-04-28 01:32:01       47 阅读
  5. idea git commit全局ignore配置

    2024-04-28 01:32:01       15 阅读
  6. http和https的区别

    2024-04-28 01:32:01       14 阅读
  7. Netty

    Netty

    2024-04-28 01:32:01      15 阅读
  8. Unity 点击无效的问题

    2024-04-28 01:32:01       12 阅读
  9. Rust的Clone

    2024-04-28 01:32:01       25 阅读
  10. 【学习心得】Pandas处理异常值的思路

    2024-04-28 01:32:01       13 阅读