> 文章列表 > 【SpringBoot】一:SpringBoot的基础(下)

【SpringBoot】一:SpringBoot的基础(下)

【SpringBoot】一:SpringBoot的基础(下)

文章目录

  • 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】

【SpringBoot】一:SpringBoot的基础(下)

【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 {@Autowiredprivate SomeService someService;@Testvoid test01(){someService.printValue();}@Testvoid contextLoads() {}
}

测试结果:
【SpringBoot】一:SpringBoot的基础(下)

1.1.4 application.yml

使用yml

# 编写配置文件 key: 值app:name: Lession07owner: rootport: 8002

还是原来的测试程序:
【SpringBoot】一:SpringBoot的基础(下)

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 {@Autowiredpublic Environment environment;public void printValue(){//通过key获取某个valueString 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 组织多文件

【SpringBoot】一:SpringBoot的基础(下)

【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);}
}

测试结果:
【SpringBoot】一:SpringBoot的基础(下)

1.1.7多环境配置

【SpringBoot】一:SpringBoot的基础(下)

【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: Lession07owner: rootport: 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);}
}

【测试】

    @Autowiredprivate MultiEnvService multiEnvService;@Testvoid test04(){multiEnvService.printMemo();}

【SpringBoot】一:SpringBoot的基础(下)

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;}@Overridepublic String toString() {return "AppBean{" +"name='" + name + '\\'' +", owner='" + owner + '\\'' +", port='" + port + '\\'' +'}';}
}

【application.yml】

# 编写配置文件 key: 值app:name: Lession07owner: rootport: 8002# 导入其它配置文件,多个文件之间使用逗号隔开
spring:config:import: conf/db.yml, conf/redis.yml# 激活某个配置文件,(环境)profiles:active: test

【测试】

    @Autowiredprivate AppBean appBean;@Testvoid test05(){System.out.println(appBean.toString());}

补充:
默认返回代理Bean对象。
【SpringBoot】一:SpringBoot的基础(下)
设置@Configuration(proxyBeanMethods = false)后返回普通Bean对象。
【SpringBoot】一:SpringBoot的基础(下)

1.2.2 嵌套Bean

【application.yml】
【SpringBoot】一:SpringBoot的基础(下)
【NestAppBean.java】
【SpringBoot】一:SpringBoot的基础(下)
【Security.java】
【SpringBoot】一:SpringBoot的基础(下)

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: root77password: 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")@Beanpublic Security createSecurity(){return new Security();}
}

【 单元测试】

    @Autowiredprivate Security security;@Testvoid test07(){System.out.println("security = " + security);}

1.2.5 集合 Map,List 以及 Array

(1)创建保存数据的Bean
【SpringBoot】一:SpringBoot的基础(下)
【SpringBoot】一:SpringBoot的基础(下)
【SpringBoot】一:SpringBoot的基础(下)

【SpringBoot】一:SpringBoot的基础(下)
(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: 22user2:name: 李四sex:age: 21

(3) 启动类,增加扫描包
【SpringBoot】一:SpringBoot的基础(下)
【测试】

@Autowiredprivate CollectionConfig collectionConfig;@Testvoid test08(){System.out.println("collectionConfig = " + collectionConfig.toString());}

【SpringBoot】一:SpringBoot的基础(下)

1.2.6 指定数据源文件

【SpringBoot】一:SpringBoot的基础(下)

【group-info.properties】

group.name=IT学习专栏
group.leader=root
group.members=20

【group.java】
【SpringBoot】一:SpringBoot的基础(下)
【测试】

    @Autowiredprivate Group group;@Testvoid test09(){System.out.println("group = " + group);}

【SpringBoot】一:SpringBoot的基础(下)

2.创建对象的三种方式

 传统的 XML 配置文件
 Java Config 技术, @Configuration 与@Bean
 创建对象的注解,@Controller ,@Service , @Repository ,@Compon

Spring Boot 不建议使用 xml 文件的方式, 自动配置已经解决了大部分 xml 中的工作了。如果需要 xml 提供 bean的声明,@ImportResource 加载 xml 注册 Bean