Spring Boot
使用“习惯优于配置”(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来。所以,我们要想把Spring Boot
玩的溜,就要懂得如何开启各个功能模块的默认配置,这就需要了解Spring Boot
的配置文件application.properties
。 Spring Boot
默认配置文件为CLASSPATH
(resources目录)下的application.properties(yml)
。
Spring Boot
使用了一个全局的配置文件application.properties
,可以放在src/main/resources(yml)
目录下或者类路径的/config
下,总之打包后需要在CLASSPATH
下。
Sping Boot
的全局配置文件的作用是对一些默认配置的配置值进行修改。
注:如果你工程没有这个application.properties(yml)
,那就在src/main/java/resources
目录下新建一个File
,命名为application.properties(yml)
。
SpringBoot
使用一个全局的配置文件,配置文件名是固定的;
配置文件的作用 : 修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
标记语言:
以前的配置文件; 大多都使用的是 xxxx.xml文件;YAML : 以数据为中心,比json
、xml
等更适合做配置文件;
YAML:配置例子
server:
port: 8081
相当于XML:
<server>
<port>8081port>
server>
K:(空格)V:表示一对键值对(空格必须有);以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
server:
port: 8081
path: /hello
属性和值也是大小写敏感;
K: V:字面直接来写;
字符串默认不用加上单引号或者双引号;
" ":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name: "zhangsan \n lisi":输出:zhangsan \n lisi
' ':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: 'zhangsan \n lisi';输出:zhangsan 换行 lisi
对象还是K: V的方式
user:
id: 1
username: 张三
age: 21
行内写法:
user: {id: 1,username: 张三,age: 21}
-
值表示数组中的一个元素pets:
- cat
- dog
- pig
行内写法
pets: [cat,dog,pig]
application.properties(yml)
提供自定义属性的支持,这样我们就可以把一些常量配置在这里:yml
:语法中间有空格
name: "张三"
age: 21
然后直接在要使用的地方通过注解@Value(value=”${name}”),使用SPEL表达式取数据,值就可以绑定到你想要的属性上面
@RestController
public class HelloController {
@Value("${name}")
private String username;
@Value("${age}")
private Integer age;
@GetMapping("/")
public String hello(){
return username+"===="+age;
}
}
我们启动工程输入http://localhost:8080 就可以看到打印了”张三====21”。
有时候属性太多了,一个个绑定到属性字段上太累,官方提倡绑定一个对象的bean
,这里我们建一个User.java
类,顶部需要使用注解@ConfigurationProperties(prefix = "user")
来指明使用哪个,注: 必须和属性名对应,否则为null
user:
id: 1
username: "张三"
age: 21
使用 @ConfigurationProperties
注解在idea
会给我们提示,需要导入配置文件处理器。
![0]
在pom
导入配置文件处理器,以后编写配置就有提示了:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
@Value
是以前spring底层的,使用@Value
需要一个一个参数指定,@ConfigurationProperties
批量注入配置文件中的属性。更多比较如下:
— | @ConfigurationProperties | @Value |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
总结: 配置文件yml
还是properties
他们都能获取到值;如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
;如果说,我们专门编写了一个javaBean
来和配置文件进行映射,我们就直接使用@ConfigurationProperties
;
类上添加@Validated
注解,实现JSR303
校验
@ConfigurationProperties
支持JSR303
数据校验,@Value
不支持JSR303
数据校验。
@Component //必须把类加到Spring容器中被管理
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
/**
*
*
*
*/
//lastName必须是邮箱格式
//@Email
//@Value("${person.last-name}")
private String lastName;
//@Value("#{11*2}")
private Integer age;
//@Value("true")
private Boolean boss;
}
@PropertySource:加载指定的配置文件;
person.properties
person.last-name=hfbin
person.age=23
person.boss=true
Person.java
@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
}
@ImportResource: 导入Spring的配置文件,让配置文件里面的内容生效;Spring Boot
里面没有Spring
的配置文件,我们自己编写的配置文件,也不能自动识别;想让Spring
的配置文件生效,加载进来;@ImportResource
标注在一个配置类上
@SpringBootApplication
@ImportResource(locations = "classpath:beans.xml")
public class Panyucable01Application {
public static void main(String[] args) {
SpringApplication.run(Panyucable01Application.class, args);
}
}
SpringBoot
推荐给容器中添加组件的方式;推荐使用全注解的方式
/**
* @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件
*
* 在配置文件中用 标签添加组件
*
*/
@Configuration
public class MyAppConfig {
//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
@Bean
public Person person(){
System.out.println("配置类@Bean给容器中添加组件了...");
return new Person();
}
}
SpringBoot
平台下采用ApplicationContextAware
的方式完成ApplicationContext
实例的获取,并通过ApplicationContext
实例完成对Spring
管理的Bean
实例手动获取。
@Component
public class BeanUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
private static final Logger logger = LoggerFactory.getLogger(BeanUtils.class);
/**
* Spring容器会在创建该Bean之后,自动调用该Bean的setApplicationContext方法
* @param applicationContext
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
if(BeanUtils.applicationContext == null) {
BeanUtils.applicationContext = applicationContext;
}
}
//获取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//通过name获取 Bean.
public static Object getBean(String name){
return getApplicationContext().getBean(name);
}
//通过class获取Bean.
public static <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}
//通过name,以及Clazz返回指定的Bean
public static <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}
}
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用)。
person.last-name=张三${random.uuid}
person.name=$person.last-name}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
# ${person.hello:默认值} 来指定找不到属性时的默认值
person.dog.age=15
Profile
是Spring
对不同环境提供不同配置功能的支持,可以通过激活、 指定参数等方式快速切换环境 。
我们在主配置文件编写的时候,文件名可以是application-{profile}.properties/yml
比如开发环境:application-dev.properties
生产环境 :application-prod.properties
默认使用application.properties
的配置
server:
port: 8081
spring:
profiles:
active: prod
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod #指定属于哪个环境
application.properties
中指定 spring.profiles.active=dev
java -jar spring-boot-panyucable-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
-Dspring.profiles.active=dev
springboot
启动会扫描以下位置的application.properties
或者application.yml
文件作为Spring boot
的默认配置文件
1、–file:./config/
2、–file:./
3、–classpath:/config/
4、–classpath:/
1、config/application.properties(项目根目录中config目录下)
2、config/application.yml
3、application.properties(项目根目录下)
4、application.yml
5、resources/config/application.properties(项目resources目录中config目录下)
6、resources/config/application.yml
7、resources/application.properties(项目的resources目录下)
8、resources/application.yml
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties
注意: 聚合工程下,在子项目中使用方式二加载application.yml配置文件不生效
SpringBoot项目在打包的时候,只会把 main 目录下的文件打包,而test、以及自己新建的config等目录是不会被打到jar包里的
SpringBoot也可以从以下外部位置加载配置:优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置。
命令行参数
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
来自java:comp/env的JNDI属性
Java系统属性(System.getProperties())
操作系统环境变量
RandomValuePropertySource配置的random.*属性值
jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
jar包外部的application.properties或application.yml(不带spring.profile)配置文件
jar包内部的application.properties或application.yml(不带spring.profile)配置文件
@Configuration注解类上的@PropertySource ,(yaml文件不支持@PropertySource )。例:
外部配置。外部配置使用file,类路径使用classpath
@Configuration
@PropertySource(value = {"file:/xxx/xxx/config/xxxConfig.properties"}, encoding = "utf-8")