01SpringBoot底层实现原理及自动配置原理

SpringBoot简介

Spring Boot 基于 Spring 开发,Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。Spring Boot 以约定大于配置的核心思想,默认帮我们进行了很多设置,多数 Spring Boot 应用只需要很少的 Spring 配置。同时它集成了大量常用的第三方库配置(例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等),Spring Boot 应用中这些第三方库几乎可以零配置的开箱即用。

简单来说就是SpringBoot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架 。
Spring Boot 出生名门,从一开始就站在一个比较高的起点,又经过这几年的发展,生态足够完善,Spring Boot 已经当之无愧成为 Java 领域最热门的技术。

主要优点:

  1. 为所有Spring开发者更快的入门
  2. 开箱即用,提供各种默认配置来简化项目配置
  3. 内嵌式容器简化Web项目
  4. 没有冗余的代码生成和Xml配置的要求

运行原理

pom.xml

父依赖:其中主要的是管理项目的资源过滤及插件
在这里插入图片描述点进去,发现还有一个父依赖
在这里插入图片描述
到这才是真正管理SpringBoot应用里面所有依赖版本的地方,SpringBoot的版本控制中心,
以后我们导入的依赖默认是不需要版本的,若没有在依赖中管理就需要手动配置版本了。

启动器:
在这里插入图片描述Springboot-boot-starter-xxx:就是spring-boot的场景启动器。

Springboot-boot-starter-web:帮我们导入了web模块的正常运行所依赖的组件。

SpringBoot将所有的功能场景都抽取出来了,做成了一个个starter(启动器),只需要在项目中引入starter即可,所有相关依赖都会自动导入。

主启动类:
在这里插入图片描述

  1. @SpringBootApplication

作用:标注在某个类上说明这个类是SpringBoot的主配置类。
点击进入这个注解:
在这里插入图片描述1.3 @ConmpnentScan

这个注解对应的xml文件中的元素,它将自动扫描并加载符合条件的组件或者bean,将这个bean定义加载到IOC容器中

1.1 @SpringBootConfiguration

标注在某个类上,表示这是一个SpringBoot的配置类
点击查看此注解
在这里插入图片描述1.1.1这里的@Configuration,说明这是一个配置类,配置类就是对应的Spring的xml配置文件
继续点击:
在这里插入图片描述
1.1.1.1 这里的@Component说明启动类本身也是Spring的一个组件而已,负责启动应用

返回SpringBootApplication注解中继续查看:

1.2 @EnableAutoConfiguration

作用为开启自动配置的功能。之前我们需要自己配置东西,现在SpringBoot则全部帮我们配置了,他会告诉SpringBoot开启自动配置的功能,这样自动配置才能生效;

点击进去继续查看:
在这里插入图片描述
1.2.1 @AutoConfigurationPackage:自动配置包
1.2.2 @impor:spring底层注解,给容器中导入一个组件
1.2.3 @Import(AutoConfigurationImportSelector.class) 给容器中导入组件

AutoConfigurationImportSelector.class:自动配置导入选择器,他会导入的选择器需要点击这个类的源码来查看:

一:此类中有以下这个方法:
在这里插入图片描述二:这个方法中又调用了SpringFactoriesLoader.loadFactoryNames()的静态方法,点击进入此方法
在这里插入图片描述三:继续点击查看loadSpringFactories方法
在这里插入图片描述spring.factories

spring.factories是自动配置的根源所在
在这里插入图片描述以DispatcherServletAutoConfiguration为例:点击进入此方法
在这里插入图片描述
所以这些都是一个个javaConfig的配置类,而且都注入了Bean,所以自动配置的实现就是从classpath下所有的spring.factories的配置文件 ,并将对应的哦如果。springframework.boot.factories配置项,通过反射实例化为对应标注了@Configuration的JavaConfig的形式的IOC容器配置类,然后将这些都汇总成为一个实例并加载到IOC容器中。
在这里插入图片描述自动配置原理
以spring.factories的某个类来解释说明

//表示这是一个配置类,和以前编写的配置文件一样,也可以给容器中添加组件;
@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;
    }
    //。。。。。。。
}

总之就是根据当前不同的条件判断,决定这个类是否生效!

  1. 一旦这个配置类生效,就会给容器中添加各种组件
  2. 这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的
  3. 所有在配置文件中能配置的属性都是在xxx.properyies类中封装着的
  4. 配置文件能配置什么就参照某个功能对应的这个属性类

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

则在配置文件中就可以配置对应的属性了

在这里插入图片描述自动配置原理总结:

  1. SpringBoot会启动加载大量的自动配置类
  2. 我们可以看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中
  3. 我们再看自动配置类当中配置了哪些组件
  4. xxx.AutoConfiguration:自动配置类,负责给容器中添加组件
  5. xxxProperties:封装配置文件中的相关属性

在这里插入图片描述最后回到主类看SpringApplication.run(),它是开启了一个服务,先是判断应用的类型是普通项目还是Web项目,之后加载所有可用的初始化器,设置到initializers属性中,找出所有的应用程序监听器,设置到listener属性中,推断并设置main方法的自定义类,找到运行的主类。
run()方法的流程分析
在这里插入图片描述

小结:

  1. SpringBoot在启动的时候从路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
  2. 将这些值作为自动配置类中导入容器,自动配置类就会生效,帮我们进行自动配置的工作
  3. 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;
  4. 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;
  5. 有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值