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

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

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

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

配置文件

jdbc:driverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/testusername: rootpassword: 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 {@Autowiredprivate JdbcProperties prop;/**这种方式不需要@Autowired注入字段,也不需要构造函数注入,直接在方法中定义配置读取类的形参,Springboot在创建DataSource对象时会自动注入JdbcProperties对象*/@Beanpublic 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 {//    @Autowiredprivate 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中读取配置文件中的内容,并将其赋值给静态变量的方法...

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

  2. 在springboot中,如何读取配置文件中的属性

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

  3. @PropertiesSource注解读取配置文件中的数据

    这是properties配置文件. 数据结构. 注入对象. 或者: 使用对象获取属性值. 或者: 了解:========================================= 通过@Pro ...

  4. [Config]如何利用ConfigurationSettings.AppSettings.GetValues读取配置文件中多个同Key的value...

    编写者:郑昀@Ultrapower 默认情况下, string[] strArray = System.Configuration.ConfigurationSettings.AppSettings. ...

  5. 读取配置文件中的内容演练 20210412_221336.mp4

    读取配置文件中的内容演练 20210412_221336.mp4 演练配置文件的读取 步骤: 先创建一个配置文件(我们可以存想要记录的数据) 然后新建测试类,来读取配置中的内容 代码 import j ...

  6. SpringBoot使用Workbook读取excel中内容

    SpringBoot使用Workbook读取excel中内容 maven文件中导入依赖 获取excel文件 FileInputStream fileInputStream = new FileInpu ...

  7. springboot取yml中的值_SpringBoot 中从yml配置文件中读取常用的参数值

    SpringBoot现在基本上都是使用application-XXX.yml(生产环境为pro,开发测试环境为dev)来配置项目中的一些配置条件,在springboot中还可以通过从yml文件中将ym ...

  8. SpringBoot 读取配置文件中参数全面教程

    一.简介 在日常开发使用 SpringBoot 框架时,经常有一些配置信息需要放置到配置文件中,我们需要手动读取这些配置到应用中进行一些逻辑,这里整理了一些常用读取配置的方法,简单介绍一下. 1.Sp ...

  9. 使用java程序读取配置文件中的相关属性值-asp.net关注

    在开发企业应用的过程中,碰到很多权限问题,有时候有些权限的代码是要写在配置文件中的,这就需要我们在判断权限的时候,通过相应的程序读取出相关的属性值,程序代码如下. 代码示例: import java. ...

最新文章

  1. scapy-yield的含义和使用
  2. 虚基类(c++细节篇七)
  3. 《嵌入式Linux软硬件开发详解——基于S5PV210处理器》——2.2 DDR2 SDRAM芯片
  4. JVM Attach机制实现
  5. WildFly 8.2.0.Final版本–更改的快速概述
  6. Android权限【大全】 .
  7. 判断一个字符串在另一个字符串中出现的次数
  8. mysql能将查询结果与表左查询,MySQL查询与结构
  9. RAID-4与模2和
  10. 常见免费邮箱 SMTP 服务地址及端口
  11. 如何转换e-ac3|dts-hd|truehd|dsd|dff|dsf|wav|flac|ape|dts|mp3|wma|m4a|mkv|mp4|ncm|kgm|kgma|vpr|qmc等音视频格式?
  12. 使用gitbook时graceful-fs报错:TypeError: cb.apply is not a function的解决方案
  13. 韩泰机器人_韩泰轮胎怎么样?进击的韩泰,拥有着对未来无限的可能!
  14. Spring报错 Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException
  15. 一个菜鸡的HTML标签备忘录【点进来可能瞎眼】
  16. Codeforces 1129C - Morse Code
  17. 亮灯泡科技php,记科学小实验《灯泡亮了》
  18. 我们的新书--《我是一只IT小小鸟》
  19. python数据分析优势-用Python做数据分析有哪些优势?
  20. Android 权限(一):权限大全

热门文章

  1. linux编程学习_您需要编程技能才能学习Linux吗?
  2. (10)CSS 常用样式--盒模型扩展应用
  3. 大佬对大佬,史诗级面试现场!!!
  4. vrep中remoteAPI 编程中遇到的没有预留命令执行时间遇到的问题
  5. 关于将vrep和matlab或者python结合的两种方法的比较
  6. 深度学习笔记(24) 卷积层
  7. kafka查看broker上主副本_kafka分区及副本在broker的分配
  8. android 呼吸灯权限_小米新机搭载炫彩呼吸灯酷到爆;三星顶级旗舰Note 10正式官宣...
  9. session过期返回登录页面跳出frame
  10. jQuery延迟对象deferred的使用