自动配置的原理

pom.xml:

spring-boot-dependencies :核心依赖在父工程中
在引入一些springboot依赖的时候,不需要指定版本,因为在父工程中已经指定了默认的版本号    

启动器:

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

启动器就是spring boot的启动场景,每引入一个starter,spring就会帮我们自动导入所需的所有的依赖。

需要什么功能,只需要引入对应的starter

HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理

//表示这是一个配置类,和以前编写的配置文件一样,也可以给容器中添加组件;
@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() {        
}
  • 一但这个配置类生效;这个配置类就会给容器中添加各种组件;
  • 这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;
  • 所有在配置文件中能配置的属性都是在xxxxProperties类中封装着;
  • 配置文件能配置什么就可以参照某个功能对应的这个属性类

通过debug=true来查看那些自动配置类生效(positive matches),哪些没生效(Negative matches)

1、SpringBoot启动会加载大量的自动配置类

2、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;

3、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)

4、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;

xxxxAutoConfigurartion:自动配置类;给容器中添加组件

xxxxProperties:封装配置文件中相关属性;

主程序

//@SpringBootApplication 标注这个类是springboot的一个应用
@SpringBootApplication
public class BootTestApplication {
    //将springboot启动起来
    public static void main(String[] args) {
        SpringApplication.run(BootTestApplication.class, args);
    }

}

SpringApplication

  1. 推断应用的类型是普通的项目还是Web项目
  2. 查找并加载所有可用初始化器,设置initalizers属性中
  3. 找到所有的应用程序监听器,设置到listeners属性中
  4. 推断并设置main方法的定义类,找到运行的主类
posted @ 2022-04-19 16:57  清水煮岁月  阅读(138)  评论(0编辑  收藏  举报