SpringBoot应用,自动配置源码刨析

约定优于配置思想

又称按约定编程,是一种软件设计规范。本质上是对系统、类库或框架中一些东西假定一个大众化合理的默认值(缺省值)。
只要不偏离默认配置,就不需要额外配置;

SpringBoot基本概念

1.springBoot是一种快速启动Spring的一种轻量级框架,可以让我们使用Spring的强大功能,又不需要像Spring那样进行大量配置;
2.SpringBoot是基于Spring4.0版本设计,它解决了依赖包的一个冲突问题还有引用不稳定的问题;

SpringBoot的相关特性

  • springBootStarter(起步依赖) springBoot将工程中所依赖的坐标进行了打包,并在打包的过程中解决依赖版本冲突和引用不稳定问题;
    也就是说本来我们需要引入10个依赖的坐标,但是springBoot将我们需要的这10个依赖坐标打包在了一起,我们只需要引用一个坐标即可,而我们无需记忆多个依赖坐标;
  • JavaConfig配置方式,由于我们是基于Spring4.0设计那自然就保留了这种配置方式,可以让我们基于Servlet3.1规范完全舍弃web.xml和其他xml配置;
    通过@Configuation注解将一个普通类定义为配置类,通过方法创建对象并在方法上添加@Bean注解将当前对象添加到IOC容器中;
  • 自动配置,SpringBoot在启动过程中会根据我们添加的jar包依赖,默认需要的配置类创建出来并放在IOC容器中;
  • 部署更简单,SpringBoot默认内置了3种Servlet容器,分别是:Tomcat,Jetty,undertow。以前我们部署需要将工程打成war包并放在Tomcat容器上,而现在SpringBoot项目是
    打成jar包,只需要一个简单的java运行环境既可以启动;

热部署

  • 热部署(devtoos插件),相对于冷部署(在重新部署过程中除了加载本地class文件外还会将第三方依赖重新加载)热部署只会加载我们本地的class文件;
  • 热部署原理是:是对classpath资源进行一个监控,而当我们本地的classpath资源产生变化的时候则会触发RestartClassLoad类加载对我们本地的classpath资源进行重新加载;
    在我们的项目中classpath资源可以分为两个部分,一个是不变资源(第三方jar包的class资源),一个是可变资源(本地class资源);当引入了热部署插件后则会通过两个类加载
    Base classLoader 和 RestartClassLoader进行类资源加载,BaseClassLoader加载的是第三方class,而RestartClassLoader加载的是我们本地的class。(注:在不引用插件的情况下使用默认类加载器)
    所以当我们的本地的class资源文件产生变化的时候就是通过RestartClassLoader类加载器重新加载class文件;
  • 热部署排除资源配置方式:spring.devtools.restart.exclude=static/,public/

全局配置文件

  • 全局配置文件格式可支持application.properties(KV形式配置) application.yaml(json超文集格式)
  • 全局配置文件的作用就是用来修改默认配置的,比如Servlet端口,servlet访问路径等等;
  • SpringBoot项目中可支持在4个地方中放置配置文件:./config/(根目录,优先级最高);/(项目根目录下);/resources/(资源文件下);resources/config/(资源文件下的config包下);
    其中./config/位置的优先级是最高的,在这4个不同的配置文件位置下如果同时配置的话:
    1.同属性配置默认取优先级最高的配置的文件,不会进行属性覆盖;
    2.配置了不同属性的情况下,所有的配置属性都会被执行;
    3.application.properties和application.yml同时配置的话:
    2.4.0之前版本优先级properties>yaml;
    2.4.0的版本,优先级yaml>properties
    如果想要使用之前的配置(2.3):spring.config.use-legacy-processing = true
    4.如果配置文件的名称不想使用默认的application的话可在加载jar包时通过命令指定名称;java -jar myproject.jar --spring.config.name=myproject
  • application.properties中的配置,springBoot会通过@ConfiguationProperties注解将配置文件的属性注入给ServiceProperties这个对象;
  • 注入形式可以分为单属性注入(@Value),批量注入(@Configuationproperties),第三方bean注入(在Bean创建方法上添加@ConfiguationProperties),
    PropertySource(“classpath:/jdbc.properties”)指定外部属性文件。在类上添加;
  • 支持松散绑定,也就是映射字段不需要完全匹配,比如羊肉串模式、驼峰命名,下划线模式;

SpringBoot日志

  • 通常情况下,日志是由一个抽象层+实现层的组合来搭建的。日志-抽象层有:JCL、SLF4J、jboss-logging;日志实现层:jul、log4j、logback、log4j2;
  • Spring 框架选择使用了 JCL 作为默认日志输出。而 Spring Boot 默认选择了 SLF4J 结合 LogBack;
  • 在使用Slf4J + 切换日志实现层的时候,需要引入一个适配器依赖,因为在实现层的日志框架是不知道有Slf4J这个抽象层的,所以需要适配;
  • 统一日志框架:像我们当前项目中引入了自己的日志框架,但是我们还引入了第三方的框架,而这些第三方框架也有自己的日志框架,比如Spring(JCL),hibbnate(JossLogging);
    日志框架统一方案:先排除第三方框架的日志依赖(),再导入日志适配转换包,将第三方日志依赖转换为我们当前系统中的日志框架;

SpringBoot源码-依赖管理

问题1:为什么引入依赖(dependency)时不需要指定依赖版本?
spring-boot-starter-parent 通过继承 spring-boot-dependencies 从而实现了SpringBoot的版本依
赖管理,所以我们的SpringBoot工程继承spring-boot-starter-parent后已经具备版本锁定等配置了,这也
就是在 Spring Boot 项目中部分依赖不需要写版本号的原因

问题2:spring-boot-starter-parent父依赖启动器的主要作用是进行版本统一管理,那么项目运行依赖的JAR包是从何而来的?
依赖启动器的主要作用是打包了开发场景所需的底层所有依赖(基于依赖传递,当前项目也存在对应的依赖jar包)
正是如此,在pom.xml中引入依赖启动器时,就可以实现对应的场景开发,而不需要额外导入依赖文件等。
当然,这些引入的依赖文件的版本号还是由spring-boot-starter-parent父依赖进行的统一管理。

SpringBoot源码-自动配置

启动类上的@SpringBootApplication注解基本理解:
1.该注解是一个组合注解,内部主要有(@SpringBootConfiguration
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值