一、 Spring Boot(一)
SpringBoot简介
简化Spring应用开发的框架
整个Spring技术栈的一个大整合
J2EE开发的一站式解决方案
Hello World探究
- pom.xml
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId><version>1.5.9.RELEASE</version>
上面的是Spring Boot的版本仲裁依赖
以后我们导入依赖默认是不需要写版本的(没有在dependencies中的自然需要声明版本号)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-starter:spring-boot场景启动器;上述帮我们导入了web模块正常运行所依赖的组件;
SpringBoot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter相关场景的所有依赖都会导入进来。
- 代码内的注解
/**
* Created by Jazon on 2019/9/4.
*/
@SpringBootApplication
public class HelloWorldMainApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldMainApplication.class, args);
}
}
1.@SpringBootApplication**: SpringBoot Application应用标注在某个类上说明是主配置类,应用要运行这个类的main方法启动SpringBoot应用
2.将自定义的包内组件注入到容器
这个注解是开启自动配置的,@AutoConfigurationPackage
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
}
@Import 将属性内的类注入到容器中
AutoConfigurationPackages.Registrar.class的作用是将主配置类(@SpringBootApplication标注的类)的所在包下面及所有子包里面的所有组件扫描到Spring容器中;
3.获得自动配置类的全类名
//导入组件的选择器
@Import(EnableAutoConfigurationImportSelector.class)
EnableAutoConfigurationImportSelector继承了AutoConfigurationImportSelector,此父类的selectImports方法会将所有需要导入的组件以全类名的方式返回,这些组件会被添加到容器中。
它会给容器中导入非常多的自动配置类(xxxAutoConfiguration),这些自动配置类会导入这个场景需要的所有组件,并配置好。有了自动配置类,免去了我们手动配置及注入的工作。
4.是如何获得上述的自动配置类的全类名的
SpringFactoriesLoader.loadFactoryNames(
getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取key为EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们完成配置工作。
所有配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar内。
5.使用Spring Initializer快速创建Spring Boot项目
- resource文件夹的目录结构
- static:保存所有的静态资源
- templates:保存所有的模板页面(嵌入式Tomcat,默认不支持JSP)
- application.properties:SpringBoot应用的配置文件
配置文件
全局配置文件
- yml:以数据为中心,不会将数据浪费到标签中。
YML基本语法
1.基本语法
k:(空格)v 表示一对键值对(空格必须有)
以空格的缩进来控制层级关系:只要是左对齐的一列数据,都是同一个层级的
server
port: 8080
path: /hello
属性和值也是大小写敏感;
2.值得写法
字面值:普通的值(数字、字符串、布尔).
字符串默认无需加单引号或双引号,双引号不会转义字符串里面的特殊字符;特殊字符会作为本身表示的意思。name: “zhangsan \n lisi”;输出:zhangsan 换行 lisi。单引号: 会转义特殊字符,特殊字符最终只是一个普通的字符串数据name: “zhangsan \n lisi”;输出:zhangsan \n lisi
对象、Map(属性和值)(键值对)
frined:
lasttName: zhangsan
age: 20
行内写法
friend: {lastName: zhangsan, age: 18}
数组
pets:
- cats
- dogs
- pigs
行内写法
pets: [cats, dogs, pigs ]
properties语法
字面值:普通的值
friend.lastName=张三
friend.aage=20
对象、Map
friend.map.key1=value1
数组
friend.lists=a,b,c
IDEA中编码默认是UTF-8,需要将配置勾选,使其转换成asci码才能不乱码。
@Value | @ConfigurationProperties | |
---|---|---|
功能 | 一个个指定 | 批量注入配置文件中的属性 |
松散语法 | 不支持,要求严格匹配 | 支持,比如大写的N匹配-N |
spEL | 支持@Value("#(11*12)") | 不支持 |
JSR303数据校验 | 不支持 | 支持比如@Email |
复杂类型封装 | 不支持 | 支持 |
如果说,只是需要获取某一项值则使用@Value
@PropertySource(value = {“classpath:person.properties”})
加载制定的配置文件
@ImportResource(locations = {“classpath:beans.xml”})
导入Spring的配置文件让其生效
这种使用XML的方式不推荐,SpringBoot推荐的给容器添加组件的方式:
1、配置类=======Spring配置文件
配置文件占位符
1、写随机数
${random.value}、${random.int}
${random.int[1024,65536]}
${random.int(10)}
2、占位符可以获取之前配置的值,如果没有可以用:(冒号)指定默认值
Profile
多profile文件
在新建配置文件时命名
application-{profile}.properties,例如application-dev.properties
默认使用application.properties的配置
激活指定profile
1.在默认配置文件中spring.profile.active=dev
yml下的多profile
1.yml是使用—区分文档块的,并在第一个文档快指定激活
spring:
profiles:
active: dev
---
spring:
profiles: dev
---
spring:
profiles: prod
配置文件加载位置
- file:./config/ 项目路径下的config目录
- file:./ 项目路径
- classpath:/config/
- classpath:/
优先级由高到低,而且还会互补配置。
自动配置原理
自动配置原理
1)、SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration
2)、@EnableAutoConfiguration作用:
-
利用EnableAutoConfiguration给容器导入一些组件
-
可以插件SelectImports()方法的内容
-
List configurations = getCandidateConfigurations(annotationMetadata, attributes)获取候选的配置
-
SpringFactoriesLoader.loadFactoryNames() 扫描所有jar包类路径下 META-INF/spring.factories 把扫描到的这些文件的内容包装成properties对象 从properties中获取到EnableAutoConfiguration对应的值,然后把他们添加在容器中。
-
3)、每一个自动配置类进行自动配置功能;
4)、以HttpEncodingAutoConfiguration为例解释自动配置原理;
@Configuration//表示这是一个配置类
//指定HttpEncodingProperties的ConfigurationProperties功能
@EnableConfigurationProperties(HttpEncodingProperties.class)
@ConditionalOnWebApplication//Spring底层@Conditional注解,根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效。此注解意思是Web应用生效
@ConditionalOnClass(CharacterEncodingFilter.class)//判断当前项目有没有这个类CharacterEncodingFilter
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)//判断配置文件中是否存在某个配置
public class HttpEncodingAutoConfiguration {
根据当前不同的条件,判断这个配置类是否生效。
5)、所有在配置文件中能配置的属性都是在xxxProperties类中封装着;配置文件能配置什么就可以参照某个功能对应的这个属性类
@ConfigurationProperties(prefix = "spring.http.encoding")//从配置文件中获取
public class HttpEncodingProperties {
日志使用
SpringBoot帮我们配置好了slf4j适配,当引入其他框架时,只需将其他框架内的日志依赖剔除,应用则会自动使用slf4j+logback。
原理(以log4j变为logback+slf4j为例,即springBoot的实现):
log4j-over-slf4j是slf4j提供的一个jar包,将log4j的接口转为了slf4j,而springboot的slf4j实现是logback,所以logback的配置文件也能影响到第三方库里的log4j的代码的输出日志。
1、默认配置
1、全局常规设置,在.properties或yml中配置
logging.level.com.atguigu=trace
#logging.path=
# 不指定路径在当前项目下生成springboot.log日志
# 可以指定完整的路径;
#logging.file=G:/springboot.log
# 在当前磁盘的根路径下创建spring文件夹和里面的log文件夹;使用 spring.log 作为默认文件 logging.path=/spring/log
# 在控制台输出的日志的格式
logging.pattern.console=%d{yyyy‐MM‐dd} [%thread] %‐5level %logger{50} ‐ %msg%n
# 指定文件中日志输出的格式
logging.pattern.file=%d{yyyy‐MM‐dd} === [%thread] === %5level === %logger{50} ==== %msg%n
2、指定配置文件,logback或logback-spring.xml,其中-spring.xml不由日志框架解析,由springBott解析,支持配置某种环境才生效。
3、切换框架