文章目录
- 1.外部化的配置
- 1.1 配置文件基础
- 1.1.1 配置文件格式
- 1.1.2 application文件
- 1.1.3 application.properties
- 1.1.4 application.yml
- 1.1.5 environment
- 1.1.6 组织多文件
- 1.1.7多环境配置
- 1.2 绑定Bean
- 1.2.1 简单的属性绑定
- 1.2.2 嵌套Bean
- 1.2.3 扫描注解
- 1.2.4 处理第三方库对象
- 1.2.5 集合 Map,List 以及 Array
- 1.2.6 指定数据源文件
- 2.创建对象的三种方式
1.外部化的配置
项目中经常使用 properties 与 yaml 文件,其次是命令行参。
1.1 配置文件基础
1.1.1 配置文件格式
properties
语法:key=value。key 是唯一的,文件扩展名为 properties
yaml
语法:key:[空格] 值
1.1.2 application文件
Spring Boot 同时支持 properties 和 yml 格式的配置文件。 配置文件名称默认是 application。我们可以使用application.properties , application.yml
1.1.3 application.properties
在application.properties中写入我们自己的配置文件
【application.properties】
【SomeService.java】
package com.sdnu.config.pk1;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.StringJoiner;
@Service
public class SomeService {
// 使用@Value("${key: 默认值}")
@Value("${app.name}")
private String name;
@Value("${app.owner}")
private String owner;
@Value("${app.port:8008}")
private Integer port;
public void printValue(){
StringJoiner joiner = new StringJoiner(";");
String s = joiner.add(name).add(owner).add(String.valueOf(port)).toString();
System.out.println("result=" + s);
}
}
【测试类】
package com.sdnu.config;
import com.sdnu.config.pk1.SomeService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Lession07ConfigApplicationTests {
@Autowired
private SomeService someService;
@Test
void test01(){
someService.printValue();
}
@Test
void contextLoads() {
}
}
测试结果:
1.1.4 application.yml
使用yml
# 编写配置文件 key: 值
app:
name: Lession07
owner: root
port: 8002
还是原来的测试程序:
1.1.5 environment
Environment 是外部化的抽象,是多种数据来源的集合。从中可以读取 application 配置文件,环境变量,系统属性。使用方式在 Bean 中注入 Environment。调用它的 getProperty(key)方法。
package com.sdnu.config.pk2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
@Service
public class ReadConfig {
@Autowired
public Environment environment;
public void printValue(){
//通过key获取某个value
String name = environment.getProperty("app.name");
System.out.println(name);
// 还可以判断某个key是否存在
if(environment.containsProperty("app.owner")){
System.out.println("app.owner存在");
System.out.println(environment.getProperty("app.owner"));
}
if(environment.containsProperty("app.port")){
System.out.println("app.port存在");
System.out.println(environment.getProperty("app.port", Integer.class, 8999));
}
}
}
1.1.6 组织多文件
【MultiConfigService.java】
package com.sdnu.config.pk3;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class MultiConfigService {
@Value("${spring.redis.host}")
private String redisHostName;
@Value("${spring.datasource.url}")
private String jdbcUrl;
public void printValue(){
System.out.println("host:" + redisHostName);
System.out.println("url:" + jdbcUrl);
}
}
测试结果:
1.1.7多环境配置
【application-dev.yml】
myapp:
memo: 这是开发环境配置文件dev
# 指定环境名称
spring:
config:
activate:
on-profile: dev
【application-test.yml】
myapp:
memo: 这是开发环境配置文件test
# 指定环境名称
spring:
config:
activate:
on-profile: test
在Application.yml中激活test
【Application.yml】
# 编写配置文件 key: 值
app:
name: Lession07
owner: root
port: 8002
# 导入其它配置文件,多个文件之间使用逗号隔开
spring:
config:
import: conf/db.yml, conf/redis.yml
# 激活某个配置文件,(环境)
profiles:
active: test
【MultiEnvService.java】
package com.sdnu.config.pk4;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class MultiEnvService {
@Value("${myapp.memo}")
private String memo;
public void printMemo(){
System.out.println("memo:::" + memo);
}
}
【测试】
@Autowired
private MultiEnvService multiEnvService;
@Test
void test04(){
multiEnvService.printMemo();
}
1.2 绑定Bean
1.2.1 简单的属性绑定
【AppBean.java】
package com.sdnu.config.pk5;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @ConfigurationProperties 表示使用Bean对象读取配置项
* prefix 表示配置文件中的多个key的公共开始部分
*/
@Component
@ConfigurationProperties(prefix = "app")
public class AppBean {
// key的名称和属性名相同,调用属性setXXXX方法给属性赋值
private String name;
private String owner;
private String port;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
@Override
public String toString() {
return "AppBean{" +
"name='" + name + '\'' +
", owner='" + owner + '\'' +
", port='" + port + '\'' +
'}';
}
}
【application.yml】
# 编写配置文件 key: 值
app:
name: Lession07
owner: root
port: 8002
# 导入其它配置文件,多个文件之间使用逗号隔开
spring:
config:
import: conf/db.yml, conf/redis.yml
# 激活某个配置文件,(环境)
profiles:
active: test
【测试】
@Autowired
private AppBean appBean;
@Test
void test05(){
System.out.println(appBean.toString());
}
补充:
默认返回代理Bean对象。
设置@Configuration(proxyBeanMethods = false)后返回普通Bean对象。
1.2.2 嵌套Bean
【application.yml】
【NestAppBean.java】
【Security.java】
1.2.3 扫描注解
@ConfigurationProperties 注解起作用,还需要@EnableConfigurationProperties 或@ConfigurationPropertiesScan。这
个注解是专门寻找@ConfigurationProperties 注解的,将他的对象注入到 。
【SpringBoot配置类】
package com.sdnu.config;
import com.sdnu.config.pk6.NestAppBean;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
//启动ConfigurationProperties
//@EnableConfigurationProperties({NestAppBean.class})
//扫描注解的包,绑定Bean注入到Spring容器
@ConfigurationPropertiesScan(basePackages = {"com.sdnu.config.pk6"})
@SpringBootApplication
public class Lession07ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(Lession07ConfigApplication.class, args);
}
}
1.2.4 处理第三方库对象
【application.yml添加新的配置】
security:
username: root77
password: 888888
【创建配置类】
package com.sdnu.config.pk7;
import com.sdnu.config.pk6.Security;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyApplicationConfig {
//创建Bean对象,属性来自配置文件
@ConfigurationProperties(prefix = "security")
@Bean
public Security createSecurity(){
return new Security();
}
}
【 单元测试】
@Autowired
private Security security;
@Test
void test07(){
System.out.println("security = " + security);
}
1.2.5 集合 Map,List 以及 Array
(1)创建保存数据的Bean
(2)配置数据【application.yml】
# 数组和List一样,一个"-" 表示一个成员
names:
- lisi
- zhangsan
# List<Myserver> servers
servers:
- title: 北京服务器
ip: 192.168.0.0.1
- title: 上海服务器
ip: 192.168.0.0.2
# Map<String, User> users
users:
user1:
name: 张三
sex: 男
age: 22
user2:
name: 李四
sex: 女
age: 21
(3) 启动类,增加扫描包
【测试】
@Autowired
private CollectionConfig collectionConfig;
@Test
void test08(){
System.out.println("collectionConfig = " + collectionConfig.toString());
}
1.2.6 指定数据源文件
【group-info.properties】
group.name=IT学习专栏
group.leader=root
group.members=20
【group.java】
【测试】
@Autowired
private Group group;
@Test
void test09(){
System.out.println("group = " + group);
}
2.创建对象的三种方式
传统的 XML 配置文件
Java Config 技术, @Configuration 与@Bean
创建对象的注解,@Controller ,@Service , @Repository ,@Compon
Spring Boot 不建议使用 xml 文件的方式, 自动配置已经解决了大部分 xml 中的工作了。如果需要 xml 提供 bean的声明,@ImportResource 加载 xml 注册 Bean