spring - Springboot
启动类
//@SpringBootApplication : 标注这个类是一个springboot的应用
@SpringBootApplication
//@ComponentScan("com.eden")
//这个注解要去掉,否则会启动定时任务,导致失败,因为没有配置定时任务
//@EnableScheduling
public class EdenAppblication {
public static void main(){
SpringApplication.run(EdenAppblication.class, args);
}
}
解析启动类
从启动类中可以看出,使用了@SpringBootApplication
注解,作用:启动类下的所有资源被导入。解析这个注解:
@SpringBootConfiguration: springboot的配置
@Configuration: spring配置类
@Component: 说明这也是一个spring组件
@EnableAutoConfiguration: 自动配置
@AutoConfigurationPackage: 自动配置包
@Import(AutoConfigurationPackage.Register.class): 自动配置`包注册`(解决为什么某些文件只能放到指定的路径下?)
@Import(AutoConfigurationImportSelector.class): 自动配置导入选择器,这个是一个类,这个类中会有很多属性及方法:
private Environment environment;//环境
private ClassLoader classLoader;//类加载器
private ResourceLoader resourceLoader;//资源加载器
private ConfigurarionClassFilter configurarionClassFilter;//配置类过滤器
那么导入了哪些选择器呢?
springboot配置文件的优先级
application.properties / application.yaml / application.yml
文件有四个配置路径分别是:
- file:./config 项目路径下新建一个config目录,里面添加application.yaml 优先级最高
- file:./ 项目目录下添加application.yaml 优先级第二
- classpath:/config/ resources目录下新建config目录,里面添加application.yaml 优先级第三
- classpath:/ resources目录下添加application.yaml 优先级第四
如果同级目录下既有application.yaml 和 application.properties 则优先读取 application.properties 的文件内容
配置多环境配置文件
在application.properties文件中配置多环境配置文件
application.properties
application-local.properties
application-test.properties
在application.properties文件中指定使用那个环境的配置文件
spring.profile.active=local
和
spring.profiles.active=${app_env:local}
在application.yaml中配置多环境配置文件
在yaml配置文件中使用 ---
分隔多配置文件
使用 spring.profiles 指定对应的文件环境
sever:
port: 8084
#指定使用那个环境下的配置文件
spring:
profiles:
active: dev
---
sever:
port:8085
#指定配置文件的环境
spring:
profiles: dev
---
sever:
port:8086
# yaml配置文件格式
```yaml
person:
name: qinjiang
age: 3
happy: false
birth: 2000/01/01
maps: {k1: v1,k2: v2}
lists:
- code
- girl
- music
dog:
name: 旺财
age: 1
yaml支持松散绑定 last-name ---> lastName
将yaml中的配置信息映射到实体类中
/*
@ConfigurationProperties作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
*/
@Component //注册bean
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
}
使用指定的配置文件
@PropertySource(value = "classpath:eden.properties") :加载指定自定义的配置文件;
@ConfigurationProperties(prefix = "person"):默认从全局配置文件中获取值;
使用 @Value("${name}")的形式给属性赋值
使用 @Value 则默认根据属性名映射
1、我们去在resources目录下新建一个person.properties文件
name=eden
@PropertySource(value = "classpath:person.properties")
@Component //注册bean
public class Person {
@Value("${name}")
private String name;
......
}
springboot能有哪些配置呢?
springboot的配置与META-INF/spring.factories
有什么联系?
@SpringBootApplication
@EnableAutoConfiguration
@Import(AutoConfigurationImportSelectot.class)
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
这里会发现,在META-INF/spring.factories
这个文件中的所有的自动配置的类,可以查看对应的自动配置类,这些类中会有前缀以及属性:
那么我们能配置的属性就是这些自动配置类中的属性。
xxxAutoConfiguration(默认值) ---> xxxProperties(修改值) ---> (配置文件)根据指定的前缀找到配置文件中对应的配置项。
pom.xml分析
<!-- 父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/>
</parent>
<!-- 依赖的jar包配置 -->
<dependencies>
<!-- web场景启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- springboot单元测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<!-- 剔除依赖 -->
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 打包插件 -->
<!--
在工作中,很多情况下我们打包是不想执行测试用例的
可能是测试用例不完事,或是测试用例会影响数据库数据
跳过测试用例执
-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--跳过项目运行测试用例-->
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
JSR303校验
@Validated //数据校验
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
@Email(message="邮箱格式错误")
private String name;
}
常用的校验注解
。。。。
彩蛋--更改启动描述语
也就是 banner 图案;
只需一步:到项目下的 resources 目录下新建一个banner.txt 即可。
图案可以到:https://www.bootschool.net/ascii 这个网站生成,然后拷贝到文件中即可