文章目录
- 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



















