摘要:在比较大型的项目的开发中,比较经常修改的属性我们一般都是不会在代码里面写死的,而是将其定义在配置文件中,之后如果修改的话,我们可以直接去配置文件中修改,那么在springboot的项目中,我们应该如何实现这个呢?

本文分享自华为云社区《springboot读取配置文件中的属性并实现自动注入》,作者: 灰小猿 。

我们知道在比较大型的项目的开发中,比较经常修改的属性我们一般都是不会在代码里面写死的,而是将其定义在配置文件中,之后如果修改的话,我们可以直接去配置文件中修改,那么在springboot的项目中,我们应该如何实现这个呢?
接下来我们以一个实例的形式教大家如何读取配置文件中的属性并使用。

以yml中数据库的配置为例,配置文件如下:

配置文件

jdbc:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test
username: root
password: root

(1)使用注解@Value映射

首先第一种方法,使用@Value注解进行映射,这种方法适用于对象的参数比较少的情况,我们可以直接在对象的属性上使用@Value注解,在其中以${}的形式传入配置文件中对应的属性,

同时需要在该类的上方使用@Configuration注解,将该类作为配置文件加入,在启动项目的时候实现注入。
实例如下:

@Configuration
public class JdbcProperties {
@Value("${jdbc.driverClassName}")
private String driverClassName;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
}

这样我们在使用该对象的属性值的时候,可以直接通过调用该对象的属性获取。

(2)使用@ConfigurationProperties映射

第二种方法相对于第一种方法更简单一些,不需要在每一个字段的上面的使用@Value注解,直接使用一个@ConfigurationProperties注解标注在类上即可,在其中传入的参数为在yml配置文件上参数的前缀,但是效果是和第一种是一样的,

@ConfigurationProperties注解声明当前类为配置读取类

prefix="jdbc"表示读取前缀为jdbc的属性

会将配置文件中前缀为prefix的属性赋给类中同名的字段

实例如下:

@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {
private String driverClassName;
private String url;
private String username;
private String password;
}

使用该注解时有一点需要注意: 必须保证属性名称和字段一模一样,且类需要提供字段的setter方法

但是如果只使用@ConfigurationProperties注解是没有效果的,他并不会讲配置文件中的参数和属性匹配。他需要配合其他在启动项目时会生效的注解一起使用才会生效,

一种方法是在JdbcProperties类上添加一个@Configuration注解,将其标识为配置类,
如下:

@Configuration
@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {
private String driverClassName;
private String url;
private String username;
private String password;
}

或者还有第二种方法:我们还可以在Spring中使用这个配置读取类,通过@EnableConfigurationProperties注解可以将指定的配置读取类的对象加载到Spring容器,也就是说,在其他配置类上使用一个@EnableConfigurationProperties注解,来将配置文件的参数和JdbcProperties类的属性绑定。这样就不需要在JdbcProperties类上使用@Configuration注解了,

实例如下:

@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfig {
@Autowired
private JdbcProperties prop; /**
这种方式不需要@Autowired注入字段,也不需要构造函数注入,
直接在方法中定义配置读取类的形参,Springboot在创建DataSource对象时会自动注入JdbcProperties对象
*/
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(prop.getDriverClassName());
dataSource.setUrl(prop.getUrl());
dataSource.setUsername(prop.getUsername());
dataSource.setPassword(prop.getPassword());
return dataSource;
}
}

(3)推荐使用:极简方式 @Bean和@ConfigurationProperties注解一起使用,

对于我个人的习惯而言,在使用的时候,我还是喜欢使用第三种方法,这种方法使用起来最简单,而且也最实用,

在一个带@Configuration注解的配置类中,我们可以直接把@ConfigurationProperties(prefix = “jdbc”)注解声明在需要使用的@Bean的方法上,Springboot会自动将配置文件中以prefix开头的属性赋给要创建对象的类的同名字段上,使用前提:要求类该类必须提供了setter方法

使用这种方法的好处就是不要在bean上做任何额外的注解声明。统一将需要进行注入容易或和配置文件参数进行绑定的类放置在一个带@Configuration注解的类中即可!

@Configuration
public class JdbcConfig {
@Bean
@ConfigurationProperties(prefix = "jdbc")
public JdbcProperties jdbcProperties(){
return new JdbcProperties();
}
}

但是以上的操作,只是将bean注入到了容器中,那么在其他类中使用的话,还是需要在每一个对象上使用@Autowired注解,那么有没有什么方法可以不使用@Autowired注解来声明自动注入呢?

@RequiredArgsConstructor注解实现自动注入

使用@RequiredArgsConstructor注解可以代替@autowired注解实现对象属性的自动注入,

使用场景:需要注入很多的mapper接口或者另外的service接口,这时候就会写很多的@Autowired注解,代码看起来很乱,lombok提供了一个注解:

@RequiredArgsConstructor(onConstructor =@_(@Autowired))

写在类上可以代替@Autowired注解,需要注意的是在注入时需要用final定义,或者使用@notnull注解

@RestController
@RequiredArgsConstructor
public class LoginTest { // @Autowired
private final LoginProperties loginProperties; @RequestMapping("/login01")
public void loginTest01(){
System.out.println("进入loginTest01方法~~~");
String language = loginProperties.getLanguage();
System.out.println(language);
} }

这样就可以避免写入重复的@Autowired了,但是就是需要注意对象必须是final修饰的才行,

总结一下,如果需要将类属性与配置文件中的参数绑定,并且注入到容器中时,推荐使用第三种方法和@RequiredArgsConstructor注解来实现!!!

点击关注,第一时间了解华为云新鲜技术~

在springboot中,如何读取配置文件中的属性的更多相关文章

  1. Java工程中如何读取配置文件中参数信息

    Java中读取配置文件中参数: 方法一:通过JDK中Properties来实现对配置文件的读取. Properties主要用于读取Java的配置文件,不同的编程语言有自己所支持的配置文件,配置文件中很 ...

  2. Java中读取配置文件中的内容,并将其赋值给静态变量的方法

    应用场景 项目开发中某个功能需要抽取成方法写成一个工具类,提供给别人使用.写过工具类的人都知道,工具类中的方法一般都是静态方法,可以直接使用类名点方法名调用, 使用很方便,比如判断某个对象是否为空的方 ...

  3. springboot读取配置文件中的信息

    在一个项目中,我们有时候会把一些配置信息写入到一个配置文件中,在java代码中读取配置文件的信息.在此记录下读取属性文件中的内容. 在springboot项目中,springboot的配置文件可以使用 ...

  4. java.util.Properties 读取配置文件中的参数

    用法 getProperty方法的返回值是String类型. java.util.Properties 读取配置文件中的参数 //读取配置文件 FileInputStream inStream = n ...

  5. mybatis 中的 xml 配置文件中 ‘<’、 ‘>’ 处理

    mybatis 中的 xml 配置文件中 '<'. '>' 处理 1.使用转义字符将 '<'. '>' 替换掉. 描述 字符 转义字符 小于号 < < 大于号 &g ...

  6. springboot如何读取配置文件中的参数(例如:application-consts.properties) 又结合maven读取配置文件的顺序

    1.启动项目后,会读取pom.xml中的配置文件,例如现在读取的是本地配置 2.找到对应的配置文件  会读取uri地址下的配置.注:如果为springboot启动无需加config项目的名称,应该本身 ...

  7. asp.net core轻松入门之MVC中Options读取配置文件

    接上一篇中讲到利用Bind方法读取配置文件 ASP.NET Core轻松入门Bind读取配置文件到C#实例 那么在这篇文章中,我将在上一篇文章的基础上,利用Options方法读取配置文件 首先注册MV ...

  8. Java中spring读取配置文件的几种方法

    Spring读取配置XML文件分三步: 一.新建一个Java Bean: package springdemo; public class HelloBean { private String hel ...

  9. JavaWeb中servlet读取配置文件的方式

    我们在JavaWeb中常常要涉及到一些文件的操作,比如读取配置文件,下载图片等等操作.那我们能不能采用我们以前在Java工程中读取文件的方式呢?废话不多说我们来看看下我们以前在Java工程中读取文件是 ...

  10. 使用 java.util.Properties 读取配置文件中的参数

    配置文件格式 如下的配置参数格式都支持: Key = ValueKey = Key:ValueKey :Value 用法 getProperty方法的返回值是String类型. //读取配置文件 Fi ...

随机推荐

  1. 为zabbix穿上一件漂亮的外衣

    zabbix+Grafana 7.0  zabbix的环境已部署好的情况下,zabbix部分-- 略 Grafana简介: 1.Grafana自身并存储数据,数据从其它地方获取.需要配置数据源 2.G ...

  2. [C++]vector的基本的用法

    [vector/容器/向量/动态数组]的基本的用法 容器的定义 向量/容器(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container). 跟任意其它类型容器一样,它能够存 ...

  3. Java Web程序在Tomcat上是如何运行的

    https://blog.csdn.net/fuzhongmin05/article/details/104379514 一个JVM是一个进程,JVM上跑Tomcat,Tomcat上可以部署多个应用. ...

  4. AJAX入门实例

    1.什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这 ...

  5. RLHF · PBRL | PEBBLE:通过 human preference 学习 reward model

    论文题目:PEBBLE: Feedback-Efficient Interactive Reinforcement Learning via Relabeling Experience and Uns ...

  6. .NET周刊【11月第1期 2023-11-09】

    国内文章 C#/.NET/.NET Core优秀项目和框架2023年10月简报 https://www.cnblogs.com/Can-daydayup/p/17804085.html 本文主要介绍了 ...

  7. git中的ole mode 和 new mode提示问题

    git status 显示如下(文件内容其实并没有改变): old mode 100644 new mode 100755 原因是: 使用chmod修改过文件权限后,filemode会有变化. 解决办 ...

  8. 算法训练 递归 s01串

    问题描述 s01串初始为"0" 按以下方式变换 0变1,1变01 输入格式 1个整数(0~19) 输出格式 n次变换后s01串 样例输入 3 样例输出 101 数据规模和约定 0~ ...

  9. Python读取Ansible playbooks返回信息

    一.背景及概要设计 当公司管理维护的服务器到达一定规模后,就必然借助远程自动化运维工具,而ansible是其中备选之一.Ansible基于Python开发,集合了众多运维工具(puppet.chef. ...

  10. TypeError: 'module' object is not callable (pytorch在进行MNIST数据集预览时出现的错误)

    在使用pytorch在对MNIST数据集进行预览时,出现了TypeError: 'module' object is not callable的错误: 上报错信息图如下: 从图中可以看出,报错位置为第 ...