写点什么

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

  • 2022 年 1 月 22 日
  • 本文字数:2699 字

    阅读完需:约 9 分钟

摘要:在比较大型的项目的开发中,比较经常修改的属性我们一般都是不会在代码里面写死的,而是将其定义在配置文件中,之后如果修改的话,我们可以直接去配置文件中修改,那么在 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 注解,将该类作为配置文件加入,在启动项目的时候实现注入。


实例如下:


@Configurationpublic 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 注解的类中即可!


@Configurationpublic 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@RequiredArgsConstructorpublic 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 注解来实现!!!


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

发布于: 刚刚阅读数: 2
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
在springboot中,如何读取配置文件中的属性