本文从以下几个方面spring boot来介绍springboot
一.概述
1.spring的问题
- 项目中配置非常多,通常一个项目中的配置文件特别的多,为什么配置特别多呢?是因为我们需要向spring容器中注入各种各样的bean,而这些bean的属性需要我们指定,所以产生了特别多的配置文件.
- 经常我们映入jar包的时候,通常需要向容器中注入框架所需要的的bean,而这些bean大多没有特殊的个性配置,所以我们考虑怎样自动化的装配bean.
2.springboot产生的原因
解决容器中注入框架固定的bean时过多的配置文件,实现自动将框架基本需求的bean都注入容器,并配上默认的属性.
3.springboot需要解决的几个问题
- 项目启动时怎么根据我们引入的jar包自动注入基础bean对象?
- 注入bean的时候怎么判断bean是否会注入冲突,或者怎样依据环境注入bean?
- 如果我们想要修改注入bean的属性,怎样修改属性呢?
向容器中注入bean有三种方案:
(1) 类上标注@Component等注解
优点:无
缺点:硬编码,而且修改源码
(2) xml文件配置等方式
优点:可以解决第1个问题,即bean的注入.
缺点:无法解决第二个问题和第三个问题.
(3) @Bean注解的方式
优点:可以解决1,2,3问题.
- 能解决注入bean的问题,同第二个一样,我们自己包装一下jar包,手动的书写一个配置类,并将bean配置到容器.
- 将bean注入容器的时候,我们还可利用@Conditional注解设置注入bean的条件
- 我们注入bean的时候,还可以利用@ConfigurationProperties注解,获取我们本地的属性修改
二.目录及文件详解
1.pom文件
(1)继承springboot
spring-boot-starter-parent(父依赖) ==>spring-boot-dependencies(父依赖)
- spring-boot-starter-parent
统一管理插件plugins - spring-boot-dependencies
通过标签dependencyManagement标签统一管理版本号
(2)spring-boot-starter-xx springboot启动环境
- 以后我们导入spring-boot-starter-xx依赖默认是不需要写版本;(没有在dependencies里面管理的依赖自然需要声明版本号)
(3) springboot的maven构建插件
<!--这个插件是maven用于构建springboot项目的插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
(4)支持yml提示的依赖
这是用于支持yml提示的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
2.主启动类(后续会在原理中详细解释)
(1)@SpringBootApplication
- 定义方法获取当前类的包,作为基础扫描的包
- 定义方法扫描所有依赖的jar包下的META-INF/spring.factories文件中的EnableAutoConfiguration的值
(2) SpringApplication.run(xx.class, args);
执行初始化方法,具体执行哪些,后面回再说.
3.配置文件(properties文件或者yml文件)
(1)yml语法
-
字面量
name: 李四 -
对象
map: {k1:11,k2:12}
或者
map:
k1: 11
k2: 12 -
数组/集合
subject: [math,english,Chinese]
或者
subject:
- math
- english
- Chinese
例如:
person:
name1: 李四
age: 12
#集合 行内写法 map: {k1:11,k2:12}
map:
k1: 11
k2: 12
#数组 行内写法 subject: [math,english,Chinese]
subject:
- math
- english
- Chinese
#对象
dog:
name: jackpo
age: 2
(2)读取配置文件中的值
-
@ConfigurationProperties(prefix= “”)
1.默认读取application文件,但也可以读取其他文件,读取其他配置文件,该类需用@PropertySource()指定其他配置文件 2.批量读取配置文件注入属性,只需要指定默认前缀即可 3.属性名必须和配置中的一致,如果不一致,则获取不到值,则为null 4.可以使用注解 @Validated ,搭配其他校验我们获取到的配置中的值. 5.不能使用spel表达式
-
@value
1.默认使用application文件,但也可以读取其他文件,读取其他配置文件,该类需用@PropertySource()指定其他配置文件 2.必须一个一个属性的注入,不像@ConfigurationProperties 注解一样批量指定 3.可以使用spel表达式获取默认配置文件中的值. 4.使用@Value注解,使用spel表达式获取配置,该spel表达式的值不能没有,没有则报错. 5.不能使用@Validated 等注解的校验功能
对比
(3) 导入其他配置文件
-
@PropertySource(value = {“classpath:person.properties”})
使用当前类路径下的person2.properties文件,则我们的@value注解和@ConfigurationProperties注解则读取这个配置文件 -
@ImportResource
导入Spring的配置文件,让配置文件里面的内容生效,加载指定的spring的配置文件;
@ImportResource(locations = {“classpath:beans.xml”})
这个效果等同于我们用注解版@Configuration,配置bean注入容器
(4) 配置文件中的占位符(包括properties文件和yml文件)
-
随机数
r a n d o m . v a l u e 、 {random.value}、 random.value、{random.int}、${random.long} r a n d o m . i n t ( 10 ) 、 {random.int(10)}、 random.int(10)、{random.int[1024,65536]} -
占位符获取之前配置的值,如果没有可以是用:指定默认值
person
last‐name: 张三${random.uuid}
age: ${random.int}
birth: 2017/12/15
boss: false
maps:
k1: v1
k2: 14
lists: a,b,c
dog:
name: ${person.hello:hello}_dog
(5) profile(多环境配置文件,指定使用不同环境的配置文件profile)
-
编写其他环境的配置文件,如dev表示开发环境,prod表示生成环境等
- properties文件
文件名格式: application-{profile}.properties
- yml文件
使用三个分割线来另起一个文档块 —
- properties文件
#使用---表示配置页分隔符
---
#dev环境
#指定当前配置页为dev
spring:
profiles: dev
server:
port: 8081
---
#prod环境
#指定当前配置页为prod
spring:
profiles: prod
server:
port: 80
-
切换到该环境,并激活配置文件的方式
-
主文件application.properties或者application.yml文件中激活其他环境的配置文件:
spring.profiles.active=prod #这里的prod是上面{}括号中的profile -
命令行方式 java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar
–spring.profiles.active=dev; 可以直接在测试的时候,配置传入命令行参数 -
虚拟机参数; -Dspring.profiles.active=dev
-
这是配置文件方式切换启动配置环境.
server:
port: 8080
#表示使用哪一个配置页
spring:
profiles:
#这个即可表示使用当前的yml分隔页,也可以表示使用其他配置文件
#如果当前配置文件有,也有其他配置文件,则读取其他配置文件的
#指定的其他配置文件名格式必须为: application-xx.properties或者application-xx.yml;xx为我们下面激活的文件
active: dev
#使用---表示配置页分隔符
---
#dev环境
#指定当前配置页为dev
spring:
profiles: dev
server:
port: 8081
---
#prod环境
#指定当前配置页为prod
spring:
profiles: prod
server:
port: 80
(6) 默认的配置文件
1)默认读取的配置文件是application.properties或者是application.yml
2)该默认配置(application文件)的加载
#springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文 件
- 默认读取的配置文件顺序
优先级从上往下,上面的优先级更高;意思如果几个配置文件都配置了相同的属性,则上面的为主;配置互补,其他配置则互补- –file:./config/
#当前项目的config目录下的application文件,即config/application文件 - –file:./
#当前项目下的application文件,即 application文件 - –classpath:/config/
#当前项目类路劲下的config/路劲下的application文件,也就是resource/config/application文件 - –classpath:/
#当前项目类路劲下的application文件,也就是resource/application文件
- –file:./config/
- 其他方式使用配置文件
通过命令的形式:
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties
4.springboot-web项目下的resources目录结构
- static:保存所有的静态资源; js css images;
- templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页 面);可以使用模板引擎(freemarker、thymeleaf);
- application.properties:Spring Boot应用的配置文件;可以修改一些默认设置;