1.主要特性
- SpringBoot Starter:他将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中;
- 使编码变得简单,SpringBoot采用 JavaConfig的方式对Spring进行配置,并且提供了大量的注解,极大的提高了工作效率;
- 自动配置:SpringBoot的自动配置特性利用了Spring对条件化配置的支持,合理地推测应用所需的bean并自动化配置他们;
- 使部署变得简单,SpringBoot内置了三种Servlet容器,Tomcat,Jetty,undertow.我们只需要一个Java的运行环境就可以跑SpringBoot的项目了,SpringBoot的项目可以打成一个jar包。
2.全局配置文件
2.1 概述以及优先级
全局配置文件能够对一些默认配置值进行修改及自定义配置。Spring Boot使用一个application.properties或者application.yaml的文件作为全局配置文件。
也可以从ConfigFileApplicationListener这类便可看出,其中DEFAULT_SEARCH_LOCATIONS属性设置了加载的目录:
按照优先级从高到底的顺序:
- 先去项目根目录找config文件夹下找配置文件
- 再去根目录下找配置文件
- 去resources下找cofnig文件夹下找配置文件
- 去resources下找配置文件
2.2 application.properties和application.yml
- application.properties
使用Spring Initializr方式构建Spring Boot项目时,会在resource目录下自动生成一个空的application.properties文件,Spring Boot项目启动时会自动加载application.properties文件。我们可以在application.properties文件中定义Spring Boot项目的相关属性,当然,这些相关属性可以是系统属性、环境变量、命令参数等信息,也可以是自定义配置文件名称和位置。
server.port=8081
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.config.name=application
- application.yml
YAML文件格式是Spring Boot支持的一种JSON超集文件格式,以数据为中心,比properties、xml等更适合做配置文件,
yml和xml相比,少了一些结构化的代码,使数据更直接,一目了然;
yml相比properties文件更简洁;
YAML文件的扩展名可以使用.yml或者.yaml;
application.yml文件使用 “key:(空格)value”格式配置属性,使用缩进控制层级关系。
这里,针对不同数据类型的属性值,介绍一下YAML
(1) value值为普通数据类型(例如数字、字符串、布尔等)
当YAML配置文件中配置的属性值为普通数据类型时,可以直接配置对应的属性值,同时对于字符串类型的属性值,不需要额外添加引号,示例代码如下:
server:
port: 8080
servlet:
context-path: /hello
(2) value值为数组和单列集合
当YAML配置文件中配置的属性值为数组或单列集合类型时,主要有两种书写方式:缩进式写法和行内式写法。其中,缩进式写法还有两种表示形式,示例代码如下:
person:
hobby:
- play
- read
- sleep
或者如下形式:
person:
hobby:
play,
read,
sleep
或者如下形式:
person:
hobby: [play,read,sleep]
(3) value值为Map集合和对象
当YAML配置文件中配置的属性值为Map集合或对象类型时,YAML配置文件格式同样可以分为两种书写方式:缩进式写法和行内式写法。
缩进式写法的示例代码如下:
person:
map:
k1: v1
k2: v2
对应的行内式写法示例代码如下:
person:
map: {k1: v1,k2: v2}
3.属性注入
使用Spring Boot全局配置文件设置属性时:如果配置属性是Spring Boot已有属性,例如服务端口server.port,那么Spring Boot内部会自动扫描并读取这些配置文件中的属性值并覆盖默认属性。如果配置的属性是用户自定义属性,还必须在程序中注入这些配置属性方可生效。
3.1 常用注解
@Configuration:声明一个类作为配置类
@Bean:声明在方法上,将方法的返回值加入Bean容器
@Value:属性注入
@ConfigurationProperties(prefix = “jdbc”):批量属性注入
@PropertySource(“classpath:/jdbc.properties”)指定外部属性文件。在类上添加
- @Value属性值注入
application.properties文件中的定义
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/springboot_h
jdbc.username=root
jdbc.password=123
注入配置文件的值:
@Value("${jdbc.url}")
String url;
@Value("${jdbc.driverClassName}")
String driverClassName;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
- @ConfigurationProperties批量注入
application.properties文件中的定义
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/springboot_h
jdbc.username=root
jdbc.password=123
新建配置文件:
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {
private String url;
private String driverClassName;
private String username;
private String password;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "JdbcProperties{" +
"url='" + url + '\'' +
", driverClassName='" + driverClassName + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
pom.xml文件中添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
测试代码:
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoSpringBootApplicationTests {
@Autowired
private JdbcProperties jdbcProperties;
@Test
public void jdbcPropertiesTest(){
System.out.println(jdbcProperties);
}
}
打印结果为:
3.2 第三方配置
除了 @ConfigurationProperties 用于注释类之外,还可以在公共 @Bean 方法上使用它。当要将属性绑定到控件之外的第三方组件时,这样做特别有用。
创建一个其他组件类:
public class AnotherComponent {
private boolean enabled;
private InetAddress remoteAddress;
// ..省略get和set方法
}
创建配置类:
@Configuration
public class AnotherConfig {
@ConfigurationProperties("another")
@Bean
public AnotherComponent anotherComponent(){
return new AnotherComponent();
}
}
创建配置信息:
another.enabled=true
another.remoteAddress=192.168.10.11
测试代码:
@Autowired
private AnotherComponent anotherComponent;
@Test
public void anotherComponentTest(){
System.out.println(anotherComponent);
}
输出结果: