目录
Spring Boot是Spring项目中的一个子工程,与我们所熟知的Spring-framework 同属于spring的产品。其最主要作用就是帮助开发人员快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让开发人员关注业务而非配置。
设计目的: 用来简化 Spring 应用的初始搭建以及开发过程。
主要特点:

1. pom.xml 添加父工程坐标、web启动器
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <groupId>com.atguigu</groupId>
- <artifactId>springboot_01</artifactId>
- <version>1.0</version>
- <!--为什么我们在添加启动器的时候不需要添加版本?
- 答:父工程帮我们统一管理
- -->
- <!--添加父工程坐标-->
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.3.6.RELEASE</version>
- </parent>
- <!--
- 为什么我们就只添加了一个启动器依赖,项目就可以运行起来了,这些jar包从何而来?
- 答:引入启动器,间接依赖了很多jar包,从本地仓库进行依赖注入
-
- -->
- <!--添加web启动器,框架提供了很多启动器(起步依赖),其实就是一组jar包的名称
- web启动器: 引入web开发相关的jar
- -->
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- </dependencies>
- <!--可选,jdk版本-->
- <properties>
- <java.version>1.8</java.version>
- </properties>
-
- </project>
2. 创建启动类
Spring Boot项目通过main函数即可启动,我们需要创建一个启动类:
- @SpringBootApplication //s声明当前项目是一个SpringBoot项目
- public class App {
- //启动内置的Tomcat服务器,即初始化Ioc容器(采用框架默认配置)
- public static void main(String[] args) {
- SpringApplication.run(App.class,args);
- }
- }
3. 编写Controller
- @RestController //相当于 @Controller + @ResponseBody
- public class HelloController {
- @RequestMapping("/hello")
- public String sayHello(){
- return "hello spring boot!!" ;
- }
- }
4. 启动测试

5. 问题
1、为什么我们在添加启动器的时候不需要在启动器的坐标中指定版本?
答案:因为我们指定了项目的父工程,在spring-boot-starter-parent中已经通过Maven的版本锁定了Jar包的版本,所以就不需要再指定了。
2、为什么我们就添加一个启动器依赖,项目就可以运行起来了,运行项目所需要的Jar包从何而来?
答案:因为我们添加了这个启动器的依赖,它已经把自己运行所需要的必要包集成在这个启动器中,通过Maven的依赖传递性,将这些包都依赖到咱们的项目里了。
springboot支持二种类型的配置文件
配置文件必须放置在项目的类加载目录下, 并且名字必须是 application,springboot项目在运行的时候会自动加载这些配置文件


- spring.jdbc.datasource.driverClassName=com.mysql.cj.jdbc.Driver
- spring.jdbc.datasource.url=jdbc:mysql://localhost:3306/db_house?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
- spring.jdbc.datasource.username=root
- spring.jdbc.datasource.password=******
新建 properties 包,创建类 DataSourceProperties
- package com.atguigu.properties;
-
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.stereotype.Component;
-
- @Component
- public class DataSourceProperties {
-
- // @Value 可以获取属性配置文件的属性值,无需get/set方法。缺点:需要一个一个获取
- @Value("${spring.jdbc.datasource.driverClassName}")
- private String driverClassName;
- @Value("${spring.jdbc.datasource.url}")
- private String url;
- @Value("${spring.jdbc.datasource.username}")
- private String username;
- @Value("${spring.jdbc.datasource.password}")
- private String password;
-
- // 生成get set 和 toString方法
- }
测试:

成功注入
YAML是一种配置文件格式,扩展名是 yaml 或 yml
1.数据结构用树形结构呈现,通过缩进来表示层级,
2.连续的项目通过减号 ” - ” 来表示
3.键值结构里面的key/value对用冒号 ” : ” 来分隔。
spring:
jdbc:
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql:///springboot_01
username: root
password: root
yml配置文件的特征:
在Spring Boot项目中配置文件的名称只能是**application** , 如果我们把所有的配置项全都写在一个配置文件中, 配置文件就会比较复杂和臃肿,不利于后期的项目维护和开发。
1.因为开发环境的变化, 我们需要修改配置文件中某一个配置项的值(比如之前是mysql数据库,切换成oracle数据库)
2.项目开发完成需要上线了 , 需要把一些环境修改成正式环境(开发,测试,上线,多环境切换)
解决方案 :使用profiles拆分配置
spring boot项目中允许使用多个YAML配置文件。
这些文件名称必须为application-***.yml,并且在application.yml中激活。
- spring:
- profiles:
- active: dev

注意 :
如果properties和yml文件都存在,不存在spring.profiles.active设置,如果有重叠属性,默认以properties优先。
如果设置了spring.profiles.active,并且有重叠属性,以active设置优先。
可以在两种文件中分别增加server.port属性指定不同的端口,启动项目查看控制台端口号进行测试。
@SpringBootApplication 注解
@ConfigurationProperties(prefix = "xxx") 注解
@ConfigurationProperties是SpringBoot提供的重要注解, 他可以将一些配置属性批量注入到bean对象(需要提供get set方法)。(@Value 注解需要属性需要一个一个获取)
报错提示,请在pom文件添加配置信息即可(不影响运行)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
@Value 一个个注入
- // @Value 可以获取属性配置文件的属性值,无需get/set方法。缺点:需要一个一个获取
- @Value("${spring.jdbc.datasource.driverClassName}")
- private String driverClassName;
- @Value("${spring.jdbc.datasource.url}")
- private String url;
- @Value("${spring.jdbc.datasource.username}")
- private String username;
- @Value("${spring.jdbc.datasource.password}")
- private String password;
| 注解 | 作用 |
| @ConditionalOnBean | 如果存在某个Bean, 配置类生效 |
| @ConditionalOnMissingBean | 如果不存在某个Bean, 配置类生效 |
| @ConditionalOnClass | 如果存在某个类, 配置类生效 |
| @ConditionalOnMissingClass | 如果不存在某个类, 配置类生效 |
| @ConditionalOnProperty | 如果存在某个属性配置, 配置类生效 |
| @ConditionalOnWebApplication | 如果是一个web应用, 配置类生效 |
| @ConditionalOnNotWebApplication | 如果不是一个web应用, 配置类生效 |
- @RestController //相当于 @Controller + @ResponseBody
- //启用属性配置类,带@ConfigurationProperties属性的类要先生效
- @EnableConfigurationProperties(value = {DataSourceProperties.class})
- public class HelloController {
-
- @Autowired
- DataSourceProperties dataSourceProperties;
-
- @RequestMapping("/hello")
- public String sayHello(){
- System.out.println(dataSourceProperties);
-
- return "hello spring boot!!" ;
- }
- }
- @SpringBootApplication //声明当前项目是一个SpringBoot项目
- public class App {
- //启动内置的Tomcat服务器,即初始化Ioc容器(采用框架默认配置)
- public static void main(String[] args) {
- /*
- * 自动配置初始化过程:
- * 1.从加载jar包中查找META-INF/spring.factories文件,构造出一些工厂对象,来初始化总起
- * 2.会查找org.springframework.boot.autoconfigure.EnableAutoConfiguration名称的值。
- * 获取了127个配置类。
- * Springboot框架与其他框架继承,提供大量配置类,简化了框架集成过程。可以提高开发效率
- * 例如: 引入了spring-boot-starter-web启动器
- * HttpEncodingAutoConfiguration 自动配置字符编码过滤器.相当于web.xml配置,默认utf-8
- * MultipartAutoConfiguration 文件上传解析器
- * WebMvcAutoConfiguration 负责创建视图解析器
- * DispatcherServletAutoConfiguration 负责创建核心控制器
- *
- *
- * */
- SpringApplication.run(App.class,args);
- }
- }

彩蛋 :英俊的张老师


在SpringApplication类构建的时候,有这样一段初始化代码:
跟进去往下走
这里发现会通过loadFactoryNames尝试加载一些FactoryName,然后利用createSpringFactoriesInstances将这些加载到的类名进行实例化。 继续跟进loadFactoryNames方法:
发现此处会利用类加载器加载一个文件: META-INF/spring.factories 。我们知道,ClassLoader默认是从classpath下读取文件,因此,SpringBoot会在初始化的时候,加载所有classpath:META-INF/spring.factories文件,包括jar包当中的。而在Spring的一个依赖包:spring-boot-autoconfigure中,就有这样的文件:
我们引入的任何第三方启动器,只要实现自动配置,也都会有类似文件。
打开后,可以发现以EnableAutoConfiguration接口为key的一系列配置,key所对应的值,就是所有的自动配置类,可以在当前的jar包中找到这些自动配置类,几乎涵盖了现在主流的开源框架 
配置类我们找到了 , 那么这些默认配置的属性来自哪里呢?
例如 : 我们配置视图解析器的时候需要配置前缀和后缀 , 那么这些配置在哪配置的呢 ?
通过源码发现, 这个配置是从this.mvcProperties.getView()中读取的 ,this.mvcProperties又是什么呢 ? 我们继续跟踪,发现其实就是定义的一个变量
这个变量中又有一个View类型的变量 , 这个变量中配置的就是前缀和后缀,默认为null
