SpringBoot入门,这一篇就够了(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: SpringBoot入门,这一篇就够了

3.5. Yaml配置文件


配置文件除了可以使用application.properties类型,还可以使用后缀名为:.yml或者.yaml的类型,也就是:application.yml或者application.yaml


33.png

基本格式:

jdbc:
  driverClassName: com.mysql.jdbc.Driver
  url: jdbc:mysql://127.0.0.1:3306/springboot_test
  username: root
  password: root


把application.properties修改为application.yml进行测试。


如果两个配置文件都有,会把两个文件的配置合并,如果有重复属性,以properties中的为准。 如果是配置数组、list、set等结构的内容,那么在yml文件中格式为:


key:
  abc: cba
  def:
    - g
    - h
    - j


3.6. 多个Yaml配置文件


当一个项目中有多个yml配置文件的时候,可以以application-**.yml命名;在application.yml中配置项目使用激活这些配置文件即可。

创建 application-abc.yml 文件如下:


itcast:
  url: http://www.itcast.cn


创建 application-def.yml 文件如下:

itheima:
  url: http://www.itheima.com


在 application.yml 文件中添加如下配置:


#加载其它配置文件
spring:
  profiles:
    active: abc,def


多个文件名只需要写application-之后的名称,在多个文件之间使用,隔开。

修改代码测试:


34.png


@Value("${itcast.url}")
private String itcastUrl;
@Value("${itheima.url}")
private String itheimaUrl;
System.out.println(itcastUrl);
System.out.println(itheimaUrl);


4. 自动配置原理


使用Spring Boot之后,一个整合了SpringMVC的WEB工程开发,变的无比简单,那些繁杂的配置都消失不见了,这是如何做到的? 一切魔力的开始,都是从我们的main函数来的,所以我们再次来看下启动类:


35.png


我们发现特别的地方有两个:

  • 注解:@SpringBootApplication
  • run方法:SpringApplication.run()

我们分别来研究这两个部分。


4.1. 了解@SpringBootApplication


点击进入,查看源码:


35.png


这里重点的注解有3个:

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan


4.1.1. @SpringBootConfiguration


我们继续点击查看源码:


36.png


通过这段我们可以看出,在这个注解上面,又有一个 @Configuration 注解。通过上面的注释阅读我们知道:这个注解的作用就是声明当前类是一个配置类,然后Spring会自动扫描到添加了 @Configuration 的类,并且读取其中的配置信息。而 @SpringBootConfiguration 是来声明当前类是SpringBoot应用的配置类,项目中只能有一个。所以一般我们无需自己添加。


4.1.2. @EnableAutoConfiguration


我们跟进源码:


37.png


关于这个注解,官网上有一段说明:


The second class-level annotation is . This annotation tells Spring Boot to “guess” how you want to configure Spring, based on the jar dependencies that you have added. Since

spring-boot-starter-web added Tomcat and Spring MVC, the auto-configuration assumes that you are developing a web application and sets up Spring accordingly.


简单的翻译以下:


第二级的注解 @EnableAutoConfiguration ,告诉Spring Boot基于你所添加的依赖,去“猜测”你想要如何配置Spring。比如我们引入了 spring-boot-starter-web ,而这个启动器中帮我们添加了tomcat 、 SpringMVC 的依赖。此时自动配置就知道你是要开发一个web应用,所以就帮你完成了web及SpringMVC的默认配置了!


总结,Spring Boot内部对大量的第三方库或Spring内部库进行了默认配置,这些配置是否生效,取决于我们是否引入了对应库所需的依赖,如果有那么默认配置就会生效。


所以,我们使用SpringBoot构建一个项目,只需要引入所需框架的依赖,配置就可以交给SpringBoot处理了。除非你不希望使用SpringBoot的默认配置,它也提供了自定义配置的入口。



4.1.3. @ComponentScan

我们跟进源码:


38.png


并没有看到什么特殊的地方。我们查看注释:


大概的意思:


配置组件扫描的指令。提供了类似与 <context:component-scan> 标签的作用 通过basePackageClasses或者basePackages属性来指定要扫描的包。如果没有指定这些属性,那么将从声明这个注解的类所在的包开始,扫描包及子包


而我们的@SpringBootApplication注解声明的类就是main函数所在的启动类,因此扫描的包是该类所在包及其子包。因此,一般启动类会放在一个比较前的包目录中。


4.2. 默认配置原理


4.2.1. spring.factories


在SpringApplication类构建的时候,有这样一段初始化代码:


39.png


跟进去:


40.png


这里发现会通过loadFactoryNames尝试加载一些FactoryName,然后利用createSpringFactoriesInstances将这些加载到的类名进行实例化。

继续跟进loadFactoryNames方法:


41.png


发现此处会利用类加载器加载META-INF/spring.factories ,然后解析其内容


我们知道,ClassLoader默认是从classpath下读取文件,因 此,SpringBoot会在初始化的时候,加载所有classpath:META-INF/spring.factories文件,包括jar包当中的。


而在Spring的一个依赖包:spring-boot-autoconfigure中,就有这样的文件:



42.png


以后我们引入的任何第三方启动器,只要实现自动配置,也都会有类似文件。


4.2.2. 默认配置类


我们打开刚才的spring.factories文件:


43.png


可以发现以EnableAutoConfiguration接口为key的一系列配置,key所对应的值,就是所有的自动配置类,可以在当 前的jar包中找到这些自动配置类:


44.png


非常多,几乎涵盖了现在主流的开源框架,例如:

  • redis
  • jms
  • amqp
  • jdbc
  • jackson
  • mongodb
  • jpa
  • solr
  • elasticsearch
  • ... 等等

我们来看一个我们熟悉的,例如SpringMVC,查看mvc 的自动配置类:


45.png


打开WebMvcAutoConfiguration:


46.png


我们看到这个类上的4个注解:


@Configuration :声明这个类是一个配置类

@ConditionalOnWebApplication(type = Type.SERVLET)

ConditionalOn,翻译就是在某个条件下,此处就是满足项目的类是是Type.SERVLET类型,也就是一个普通web工程,显然我们就是

@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })

这里的条件是OnClass,也就是满足以下类存在:Servlet、DispatcherServlet、WebMvcConfigurer,其中Servlet只要引入了tomcat依赖自然会有,后两个需要引入SpringMVC才会有。这里就是判断你是否引入了相关依赖,引入依赖后该条件成立,当前类的配置才会生效!

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

这个条件与上面不同,OnMissingBean,是说环境中没有指定的Bean这个才生效。其实这就是自定义配置的入口,也就是说,如果我们自己配置了一个WebMVCConfigurationSupport的类,那么这个默认配置就会失效!


接着,我们查看该类中定义了什么:

视图解析器:


47.png


处理器适配器(HandlerAdapter):


48.png


还有很多,这里就不一一截图了。


4.2.3. 默认配置属性


另外,这些默认配置的属性来自哪里呢?


49.png


我们看到,这里通过@EnableAutoConfiguration注解引入了两个属性:WebMvcProperties和ResourceProperties。这不正是SpringBoot的属性注入玩法嘛。

我们查看这两个属性类:


50.png


找到了内部资源视图解析器的prefix和suffix属性。

ResourceProperties中主要定义了静态资源(.js,.html,.css等)的路径:


51.png


如果我们要覆盖这些默认属性,只需要在application.properties中定义与其前缀prefix和字段名一致的属性即可。


4.3. 总结


SpringBoot为我们提供了默认配置,而默认配置生效的步骤:


@EnableAutoConfiguration注解会去寻找 META-INF/spring.factories 文件,读取其中以 EnableAutoConfiguration 为key的所有类的名称,这些类就是提前写好的自动配置类

这些类都声明了 @Configuration 注解,并且通过 @Bean 注解提前配置了我们所需要的一切实例

但是,这些配置不一定生效,因为有 @ConditionalOn 注解,满足一定条件才会生效。比如条件之一:是一些相关的类要存在

类要存在,我们只需要引入了相关依赖(启动器),依赖有了条件成立,自动配置生效。

如果我们自己配置了相关Bean,那么会覆盖默认的自动配置的Bean

我们还可以通过配置application.yml文件,来覆盖自动配置中的属性


1)启动器


所以,我们如果不想配置,只需要引入依赖即可,而依赖版本我们也不用操心,因为只要引入了SpringBoot提供的stater(启动器),就会自动管理依赖及版本了。


因此,玩SpringBoot的第一件事情,就是找启动器,SpringBoot提供了大量的默认启动器


2)全局配置


另外,SpringBoot的默认配置,都会读取默认属性,而这些属性可以通过自定义 application.properties 文件来进行覆盖。这样虽然使用的还是默认配置,但是配置中的值改成了我们自定义的。


因此,玩SpringBoot的第二件事情,就是通过 application.properties 来覆盖默认属性值,形成自定义配置。我们需要知道SpringBoot的默认属性key,非常多,可以再idea中自动提示


属性文件支持两种格式,application.properties和application.yml


yml的语法实例:


jdbc:
  driverClassName: com.mysql.jdbc.Driver
  url: jdbc:mysql://127.0.0.1:3306/springboot_test
  username: root
  password: root
server:
  port: 80


如果properties和yml文件都存在,如果有重叠属性,默认以Properties优先。遇到需要修改的组件的配置项流程为:


52.png



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
Java 测试技术 Spring
Gradle从0入门到实战系列【八】SpringBoot集成Junit单元测试
JUnit 是一个 Java 编程语言的单元测试框架。JUnit 在测试驱动的开发方面有很重要的发展,是起源于 JUnit 的一个统称为 xUnit 的单元测试框架之一。
1669 1
Gradle从0入门到实战系列【八】SpringBoot集成Junit单元测试
|
XML Java 测试技术
SpringBoot入门篇 01、Springboot入门及配置(二)
SpringBoot入门篇 01、Springboot入门及配置(二)
|
XML Java 应用服务中间件
SpringBoot 快速入门(保姆级详细教程)
SpringBoot快速入门,保姆级别超详细,解决IDEA创建SpringBoot项目一直转圈圈。
671 0
SpringBoot 快速入门(保姆级详细教程)
|
存储 Java 测试技术
Idea工具中创建 SpringBoot工程及入门详解
Idea工具中创建 SpringBoot工程及入门详解
1362 4
Idea工具中创建 SpringBoot工程及入门详解
|
Java 关系型数据库 MySQL
MyBatis-Plus 入门 【SpringBoot版】
今天来带大家入门学习MyBatis-Plus,MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
|
druid Java 关系型数据库
《SpringBoot篇》01.Springboot超详细入门(基础篇)(三)
《SpringBoot篇》01.Springboot超详细入门(基础篇)(三)
504 0
《SpringBoot篇》01.Springboot超详细入门(基础篇)(三)
|
JSON Java 应用服务中间件
《SpringBoot篇》01.Springboot超详细入门(基础篇)(二)
《SpringBoot篇》01.Springboot超详细入门(基础篇)(二)
179 0
《SpringBoot篇》01.Springboot超详细入门(基础篇)(二)
|
Java 应用服务中间件 Maven
《SpringBoot篇》01.Springboot超详细入门(基础篇)(一)
《SpringBoot篇》01.Springboot超详细入门(基础篇)(一)
234 0
《SpringBoot篇》01.Springboot超详细入门(基础篇)(一)
|
开发框架 负载均衡 前端开发
SpringBoot入门篇 01、Springboot入门及配置(一)
SpringBoot入门篇 01、Springboot入门及配置(一)
|
Java 应用服务中间件 数据库连接
springboot入门demo详解(解决跨域)
微服务自问世以来就一直很火。天天耳听Springboot,Springcloud,docker,这些名词,以前没学Springboot的时候刚学ssm的时候,,说实话头都炸了。单独一个个学习Spring,Springmvc,mybatis还能将就配置,记得当初把三个整合的时候可是费了好大的功夫,然后又将ssm转成idea的maven项目又转了一大圈,找了好久,n个bug才把ssm搭成功。
233 0
springboot入门demo详解(解决跨域)
下一篇
DataWorks