springBoot 的基础结构一共三个文件
* src/main/java 程序开发以及主程序入口
* src/main/resources 配置文件
* src/test/java 测试程序
配置文件:
pom 文件中一些依赖的解释
### springboot 将功能场景抽取出来,做成一个个的starters。
* spring-boot-starter
* 包括自动配置支持
* 日志
* YAML
* 如果引入了 spring-boot-starter-web 可以去掉此配置,因为web模块自动依赖了spring-boot-starter
* spring-boot-test 测试模块
* Junit
* Hamcrest 书写匹配器对象时允许直接定义匹配规则的框架,大量的是侵入式的。但是匹配对象在书写灵活的测试是最常用的
* Mocito 是一个mocking框架,让你用简单干净的API写漂亮的测试代码。Mockito不会让你混乱 ,因为测试代码具有非常好的可读性,Mockito可以创建纯净的环境来进行代码功能的验证。
注解的解释
* @SpringBootApplication
* 说明这个类是Spring Boot的主配置类,
* 运行这个类的main方法启动sringboot 应用
* @SpringBootConfiguration
* springboot 的配置类
* @EnableAutoConfiguration 字如其意 ,自动配置类。可以在配置文件中启用debug=true属性来让控制台自动配置报告。
* 作用:
1. 给容器中导入一些组件
* 将类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration 的值加入到容器中。这样每一个xxxAutoConfiguration 类都是容器中的一个组件,用它们来做自动配置类
* @PropertySource 加载指定的配置文件
* @ImportResource 导入spring的配置文件,让里面的配置文件生效
* springboot 更推荐用注解的方式来给容器中添加组件;推荐使用全注解的方式
* @Configuration 表明当前类是一个配置类,来代替spring配置文件(beans.xml)
* @Bean 通常使用@configuration注解的时候会用到它,将方法的返回值添加到容器中,默认的id就是方法名。
* junit 测试中用到的
* @RunnerWith(SpringRunnner.calss) 表命用spring的驱动器来运行
* @SpringBootTest 表面是一个单元测试
配置文件简介
* 作用:
* 修改springBoot 自动配置的默认值,同时也可以注入数据
1. application.properties 可以在测试期间进行类似编码一样的自动注入等容器功能。
2. application.yml
1. 基本语法:
1. k: V : 用来表示一对键值对(中间必须有空格)
2. 属性和值都是大小写敏感的
3. 字符串默认不用加单引号和双引号
* "" :双引号 它里面的特殊字符 (如 \n)输出的时候会变为换行的意思
* '' : 单引号 它里面写的是什么字符,输出的就是什么字符,没有特殊的,万物平等
4. 可以写对象
1. 需要注意缩进
friends:
lastname: zhujingwen
age: 20
5. 也可以写数组
list:
- a
- b
- c
javaBean 上面的注解
* @ConfigurationProperties(prefix = "person")
* 这个主要是用来对bean 对象进入注入(就是将applicaton.yml 里面的 对象person 的信息注入到这个bean里面)
* @Component 也要标注在配置类上面,因为配置类也是容器中的一个组件。它的作用是创建一个容器
* 可以导入配置文件处理器 spring-boot-configuration-processor 以后编写配置时就有提示了
* @Value 和@ConfiurationProperties 获取值的比较
1. 一般在业务逻辑中需要获取一个配置文件中的某个值,就使用@value
2. 如果专门编写了一个javaBean来和配置文件进行映射,就用@ConfigurationProperties
3. @ConfigurationProperties
1. 可以注入配置文件中的属性
2. 支持松散绑定(松散语法)
* -person.firstName: 标志方式
* -person.first-name: 大写用-
* person.first_name 大写用_
* PERSON_FIRST_NAME 推荐系统属性使用这种写法
3. 不支持 SpEL
4. 支持JSR303数据校验,数据校验一定要用它
* 比如校验用户名是邮箱格式时,就一定要用这种格式
4. @Value
1. 需要一个个指定赋值对象
2. 不支持松散绑定
3. 支持SpEL
* 可以用表达式赋值
4. 不支持数据校验
5. 不支持复杂类型封装
多Profile 文件
* 在主配置文件编写的时候,文件名可以为 application-{profile}.peoperties/yml
* 默认使用application.properties 的配置
* yml 支持多文档的方式
* springboot 使用snakeymal 解析yml 文件
* 可以直接在yml文件中指定多种环境
* 多个文档需要用- - -隔开。(也就是一个application.yml文件中有多个文档)
* 激活指定profile
1. 在配置文件中指定 可以在文档后面用 active: 指定的文件的名字 来激活改文档
2. 命令行的方式
* java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
* 可以直接在测试的时候,配置传入命令参数
3. 虚拟机参数
1. -Dspring.profiles.active=dev
配置文件加载位置
* springboot 启动会扫描一下位置的application.properties或者application.yml文件作为SpringBoot的默认配置文件
1. file:/config/
2. file:/
3. classpath:/config/
4. classpath:/
* 它们优先级从高到底,高优先级的配置会覆盖低优先级的配置。springBoot会从四个位置全部加载主配置文件,来互补配置
* 也可以通过spring.config.location来改变默认的配置文件的位置,也就是在项目打包好后,使用命令行参数的形式,在启动项目时指定配置文件的新位置。
### 外部配置加载顺序
1. 命令行参数
2. 来自java:comp/env的JNDI属性
3. Java系统属性(System.getProperties())
4. 操作系统环境变量
5. RandomValuePropertySource配置的random.*属性值
6. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
7. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件
9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件
10. @Configuration注解类上的@PropertySource
11. 通过SpringApplication.setDefaultProperties指定的默认属性
* 后面的规则主要是
* 从有profile到无profile寻找
* 由jar包外向jar包内进行寻找
* 注意:
* 所有的配置都可以在命令行上进行指定,多个配置之间用空格分开:格式为: jar包名字 --配置项1=值1 配置项2=值2
* 使用spring.config.location 时系统只会加载指定配置文件的内容,包内的配置文件会互补
*
配置文件中的占位符
* 配置文件中可以使用随机数
* ${random.value}、${random.int} 、${random.long}
* eg: ${random.int(1.0)}、
* 属性也可以配置占位符
* 可以在配置文件中引用前面配置过的属性,只要是前面配置过的属性,都能用
* ${app.name:默认值} 可以用来指定找不到属性时的默认值
springboot的日志管理
1.日志抽象层: JCL ,SLF4J,Jboss-logging
2.日志实现: Log4j Log4j2 JUL Logback
3.apacghe下的:
* Log4j
* JUL
JCL 定义一套日志接口 内部提供一个Simple Log 的简单实现,
底层可以是Log4j 也可以是JUL
* slf4j
* Logback
* Log4j2
项目中使用 SLF4j 和LogBack
SLF4j 还可以与其他日志的实现框架组合
使用的时候要导入 slf4j 的jar包 和它实现类的 jar包
spring 和Hibrnate 和Mybatis 底层都使用了不同的日志框架
统一日志框架的办法
- 将系统中其他日志框架先排除出去
- 用中间包来替换原有的日志框架
- 导入slf4j 其他的实现包
偷梁换柱大法: 替代的日志的jar包虽然名字跟slf4j 有关,但是内部的包名依然是原先的包名。然而当创建时,LogFactory 实例化时创建的也是SLF4JlogfFactory。 作者就是通过这种方式实现了偷梁换柱,以达到日志框架的统一的目的。
* spring boot 默认日志级别是info及以后的级别,可更改在配置文件中可以更改: logging.level.root=debug
1.可以在application.properties 文件中进行设置
logging.level.root=debug
2.可设置指定包文件下的日志级别
logging.level.com.hand=trace
* 配置日志文件位置
1.只指定文件名
使用 logging-file 指定文件名
logging.file=
2. 指定文件路径+文件名
3.指定文件路径
logging.path=
* 配置日志格式(也是在 application.properties或者application.yml中配置的)
1) 控制台日志格式
logging.pattern.console=
2) 更改文件日志格式
logging.pattern.file=
Spring Boot 日志默认配置原理及高级特性
默认配置原理:源码中可以找到对相应的日志框架的基本配置
添加指定配置
:1. 在资源文件夹下添加相关框架的配置文件
添加logback.xm和logback-spring.xml 区别
第一个是被底层框架Logback识别,第二个是被springBoot识别加载,它支持<springProfile>
标签来设置不同环境的日志配置
- 在项目中使用SLF4J :
- 首先导入SLF4J 和Logback的jar包
- 由于SLF4J本身并无实现,所以需要导入实现类的jar包
- 在代码中使用时:
- import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
* 使用日志框架的高级功能步骤:
* 只需要在资源文件夹(resources)下添加相关框架的配置文件
* SpringBoot支持添加<springProfile/>标签设置不同环境的日志配置。
SpringBoot 与Web开发
* 主要分为以下三步:
1. 创建springboot 模块时最好选中, web、数据库、mybatis等
2. SpringBoot已经默认上一步中所选场景配置好了,全部在External Libraries里,只需要在配置文件中指定少量配置就可以运行起来。如web配置:
3. 编写业务层代码
Spring Boot 对静态资源的映射规则
* 一般的web应用会将静态页面放到webapp下,但是springBoot 是一种打包为jar的方式,因而页面的css文件放在哪,springBoot有自己的规定
* Spring Boot MVC的相关配置都在WebMvcAutoConfiguration里面,该文件在web自动配置里下的servelt里,此处重点了解WebMvcAutoConfiguration里的addResourceHandlers方法,即添加資源映射
1. 规则一: 引入公共资源:
1. 所有 /webjars/**,都去classpath:/META-INF/resources/webjars/ 找资源。这我们不用其实不用管,因为自动导入maven依赖,需要的时候自己就会去找。我们可以直接用
2. 规则二: 引入自添加的资源
* ”/**“ 访问当前项目的任何资源,若没出来,则去(静态资源的文件夹)去找映射
* 静态资源文件夹如下:
* classpath:/META-INF/resources/
* classpath:/resources/
* classpath:static/
* classpath:/public/
* "/" :当前项目的根路径
3. 规则三: 欢迎页
1. 静态资源文件夹下的所有 index.html页面,被”/**“映射
2. 在没有添加index.html时,访问localhost:8080会找不到页面
4. 规则四: 所有的 **/favicon.ico都是在静态资源文件夹下找(浏览器前面地址栏图标)
5. 可以在配置文件(application.properties/yml)下面自定义静态资源文件夹
1. 使用: spring.resources.static-locations配置,多个文件用 ,逗号隔开 .
2. 当定义了自定义的静态资源文件夹之后,原有的静态资源文件夹就不用了
模板引擎(重点)
* 由于创建的项目时以jar包方式而不是web方式,并且使用的是嵌入式的tomcat,所以默认是不支持jsp页面的。如果直接用纯静态的html页面进行开发,会非常麻烦。所以Spring Boot推荐用户使用模板引擎。如:JSP、Velocity、Freemarker、Thymeleaf 。
* springboot 推荐用户使用Thymeleaf 。一个现代化的java服务端模板引擎
使用Thymeleaf
1. 引入Thymeleaf
在pom文件中添加依赖
2. Thymeleaf 规则
1. 它的自动配置规则在 spring-boot-autoconfigure 里面,我们需要根据配置规则来使用Thymeleaf。Thymeleaf的配置规则封装在ThymeleafProperties里面
2. thymeleaf 渲染
1. 由规则可以看出,我们只要把HTML 页面放在classpath:/themplates/, thymeleaf 就能自动渲染
3. 语法规则
1. 简单使用:
1. 导入thymeleaf 的名称空间,首先在html页面加入 <html lang="en" xmlns:th="http://www.thymeleaf.org">,作用是提示代码
2. 抓取请求域数据
1. 通常情况下,我们获取值用${xxx},在Thymeleaf中,利用th:text改变当前元素里面的文本内容,如div,需要注意的是,div和th之间是空格。
<div th:text="${抓取的属性名}"></div>
2. th:任意html属性来替换原生属性的值。
* 如一个div里有id属性,class属性等,我们可用th:id th:class等来替换原生属性。
3. 语法表达式:
1. Variable Expressions: ${...}:获取变量值
2. Selection Variable Expressions: *{…} 选择表达式:和${}在功能上是一样
3. Message Expressions: #{...}:获取国际化内容
4. Link URL Expressions: @{...}:定义URL
5. Fragment Expressions: ~{...}:片段引用表达式
使用SpringMVC 自动配置
待学习