1. 什么是配置文件
配置文件是一种计算机文件,可以为一些计算机程序配置参数和初始设置。
2. 为什么需要配置文件
在我们平时写程序的时候,有些参数是经常改变的,而这种改变不是我们预知的。比如说我们开发了一个操作数据库的模块,在开发的时候我们连接本地的数据库那么IP ,数据库名称,表名称,数据库主机等信息是我们本地的,要使得这个操作数据的模块具有通用性,那么以上信息就不能写死在程序里。通常我们的做法是用配置文件来解决
3. Java 应用常见的配置文件格式
Java 中常用的有 properties 配置文件和 yml 配置文件
3.1 特殊说明
理论上讲 properties 可以和 yml 一起存在于一个项目当中,当 properties 和 yml 一起存在一个项 目中时,如果配置文件中出现了同样的配置,比如 properties 和 yml 中都配置了“server.port”, 那么这个时候会以 properties 中的配置为主,也就是 .properties 配置文件的优先级最高,但加载完 .properties 文件之后,也会加载 .yml 文件的配置信息。
虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取一种统一的配置文件格式,这样可以更好的维护(降低故障率)。这就好像连锁店的服饰一样,不管是老款的服装还是新款的服装,一定要统一了才好看。
4. *.properties
4.1 properties 配置文件说明
properties 配置文件是最早期的配置文件格式,也是创建 Spring Boot 项目默认的配置文件。
4.2 properties 基本语法
properties 是以键值的形式配置的,key 和 value 之间是以“=”连接的,如:
# 配置数据库 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=root
4.3 注意
一般properties 配置文件默认字符集为 GBK 格式,所以不能出现中文
5. *.yml
5.1 yml 配置文件说明
yml 是 YMAL 是缩写,它的全称 Yet Another Markup Language 翻译成中文就是“另一种标记语言”。 yml 是一个可读性高,易于理解,用来表达数据序列化的格式。它的语法和其他高级语言类似,并且可以简单表达清单(数组)、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等。
5.2 yml 基本语法
yml 是树形结构的配置文件,它的基础语法是“key: value”,注意 key 和 value 之间使用英文冒汗加空 格的方式组成的,其中的空格不可省略。格式如下:
# yml 配置数据库 spring: datasource: url: jdbc:mysql://127.0.0.1:3306/shujvku?characterEncoding=utf8 username: root password: 123456
6. 修改 Spring 配置的一些配置信息
# 修改 Spring 默认 banner 是否显示 spring.main.banner-mode=false # 修改 Spring 开始日志是否打印 spring.main.log-startup-info=off # 修改 banner 样式 spring.banner.image.location=classpath:1.png # true 打印完全日志 debug=false # 打印日志的路径 logging.file.name=D:\\JAVA\\myapp.log # 设置日志输出级别 # logging.level + 包名,会影响包下所有的输出级别,直接是类名,就仅仅此类 logging.level.com.hsq.demo=debug
7. 在配置文件中配置对象
具体怎么拿出对象的属性值,在第 8 点中一并说明
hsq.name=hsq hsq.age=20
8. 在 Bean 读取配置信息的三种方法
# 配置文件中的信息 hsq.name=hsq hsq.age=20
8.1 使用 Spring 提供的 Environment 对象
使用 @Autowired 注解注入 Environment 对象
@Slf4j @Component public class ReadFromConfig1 { @Autowired public ReadFromConfig1(Environment environment) { String name = environment.getProperty("hsq.name"); log.info("读取到的 hsq.name = " + name); String age = environment.getProperty("hsq.age"); log.info("读取到的 age = " + age); } }
8.2 使用 @Value 注解
@Slf4j @Component public class ReadFromConfig2 { @Autowired public ReadFromConfig2( @Value("${hsq.name}") String name, @Value("${hsq.age}") String age ) { log.info("读取到的 hsq.name = " + name); log.info("读取到的 age = " + age); } }
8.3 使用注解 @ConfigurationProperties 将配置信息包装成对象
@Component @ConfigurationProperties(prefix = "hsq") public class HsqConfig { String name; String age; // setter 方法必须有,否则不会生效 public void setAge(String age) { this.age = age; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public String getName() { return name; } }
@Slf4j @Component public class ReadFromConfig3 { @Autowired public ReadFromConfig3(HsqConfig hsqConfig) { log.info("读取到的 hsq.name = " + hsqConfig.getName()); log.info("读取到的 age = " + hsqConfig.getAge()); } }
9. 使用配置文件配置 MySQL 数据库
9.1 将配置信息写入配置文件
spring: datasource: url: jdbc:mysql://127.0.0.1:3306/java22_diaocha?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: root
9.2 读取配置信息并包装成对象
这里的 setter 方法由 lombok 中的 @Data 自动生成
@Component @ConfigurationProperties(prefix = "spring.datasource") @Data public class MySQLConfig { String url; String username; String password; }
9.3 将配置信息对象注册进 Spring 库
以方法注册的方式注册
@Slf4j @Configuration public class AppConfig { @Bean public DataSource dataSource(@Autowired MySQLConfig config) { MysqlDataSource dataSource = new MysqlDataSource(); log.info("MySQL 配置如下:" + dataSource); dataSource.setURL(config.url); dataSource.setUser(config.username); dataSource.setPassword(config.password); return dataSource; } }
9.4 写 SQL 操作数据库
@Slf4j @SpringBootApplication public class DemoApplication { @SneakyThrows public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(DemoApplication.class, args); // 从库中得到 dataSource 对象 DataSource dataSource = context.getBean(DataSource.class); try (Connection c = dataSource.getConnection()) { String sql = "select uid, username, password from users"; try (PreparedStatement ps = c.prepareStatement(sql)) { log.info("执行的 SQL = " + ps); try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { log.info("uid = {}, username = {}, password = {}", rs.getInt("uid"), rs.getString("username"), rs.getString("password")); } } } } } }
打印得到从库中查到的数据,说明配置成功