Spring Boot读取properties配置文件中的数据

2023-05-16

Spring Boot 专栏:https://blog.csdn.net/dkbnull/category_9278145.html

Spring Cloud 专栏:https://blog.csdn.net/dkbnull/category_9287932.html

GitHub:https://github.com/dkbnull/SpringBootDemo

Gitee:https://gitee.com/dkbnull/SpringBootDemo

Spring Boot最常用的3种读取properties配置文件中数据的方法:

1、使用@Value注解读取

读取properties配置文件时,默认读取的是application.properties。

application.properties:

demo.name=Name
demo.age=18

Java代码:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GatewayController {

    @Value("${demo.name}")
    private String name;

    @Value("${demo.age}")
    private String age;

    @RequestMapping(value = "/gateway")
    public String gateway() {
        return "get properties value by ''@Value'' :" +
                //1、使用@Value注解读取
                " name=" + name +
                " , age=" + age;
    }
}

运行结果如下:

这里,如果要把

 @Value("${demo.name}")
            
private String name;
            
@Value("${demo.age}")
            
private String age;

部分放到一个单独的类A中进行读取,然后在类B中调用,则要把类A增加@Component注解,并在类B中使用@Autowired自动装配类A,代码如下。

类A:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class ConfigBeanValue {

    @Value("${demo.name}")
    public String name;

    @Value("${demo.age}")
    public String age;
}

类B:

import cn.wbnull.springbootdemo.config.ConfigBeanValue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GatewayController {

    @Autowired
    private ConfigBeanValue configBeanValue;

    @RequestMapping(value = "/gateway")
    public String gateway() {
        return "get properties value by ''@Value'' :" +
                //1、使用@Value注解读取
                " name=" + configBeanValue.name +
                " , age=" + configBeanValue.age;
    }
}

运行结果如下:

注意:如果@Value${}所包含的键名在application.properties配置文件中不存在的话,会抛出异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'configBeanValue': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'demo.name' in value "${demo.name}"

2、使用Environment读取

application.properties:

demo.sex=男
demo.address=山东

Java代码:

import cn.wbnull.springbootdemo.config.ConfigBeanValue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GatewayController {

    @Autowired
    private ConfigBeanValue configBeanValue;

    @Autowired
    private Environment environment;

    @RequestMapping(value = "/gateway")
    public String gateway() {
        return "get properties value by ''@Value'' :" +
                //1、使用@Value注解读取
                " name=" + configBeanValue.name +
                " , age=" + configBeanValue.age +
                "<p>get properties value by ''Environment'' :" +
                //2、使用Environment读取
                " , sex=" + environment.getProperty("demo.sex") +
                " , address=" + environment.getProperty("demo.address");
    }
}

运行,发现中文乱码:

这里,我们在application.properties做如下配置:

server.tomcat.uri-encoding=UTF-8
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
spring.messages.encoding=UTF-8

然后修改IntelliJ IDEA,File --> Settings --> Editor --> File Encodings ,将最下方Default encoding for properties files设置为UTF-8,并勾选Transparent native-to-ascii conversion。

重新运行结果如下:

3、使用@ConfigurationProperties注解读取

在实际项目中,当项目需要注入的变量值很多时,上述所述的两种方法工作量会变得比较大,这时候我们通常使用基于类型安全的配置方式,将properties属性和一个Bean关联在一起,即使用注解@ConfigurationProperties读取配置文件数据。

在src\main\resources下新建config.properties配置文件:

demo.phone=10086
demo.wife=self

创建ConfigBeanProp并注入config.properties中的值:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "demo")
@PropertySource(value = "config.properties")
public class ConfigBeanProp {

    private String phone;

    private String wife;

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getWife() {
        return wife;
    }

    public void setWife(String wife) {
        this.wife = wife;
    }
}

@Component 表示将该类标识为Bean

@ConfigurationProperties(prefix = "demo")用于绑定属性,其中prefix表示所绑定的属性的前缀。

@PropertySource(value = "config.properties")表示配置文件路径。

使用时,先使用@Autowired自动装载ConfigBeanProp,然后再进行取值,示例如下:

import cn.wbnull.springbootdemo.config.ConfigBeanProp;
import cn.wbnull.springbootdemo.config.ConfigBeanValue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GatewayController {

    @Autowired
    private ConfigBeanValue configBeanValue;

    @Autowired
    private Environment environment;

    @Autowired
    private ConfigBeanProp configBeanProp;

    @RequestMapping(value = "/gateway")
    public String gateway() {
        return "get properties value by ''@Value'' :" +
                //1、使用@Value注解读取
                " name=" + configBeanValue.name +
                " , age=" + configBeanValue.age +
                "<p>get properties value by ''Environment'' :" +
                //2、使用Environment读取
                " sex=" + environment.getProperty("demo.sex") +
                " , address=" + environment.getProperty("demo.address") +
                "<p>get properties value by ''@ConfigurationProperties'' :" +
                //3、使用@ConfigurationProperties注解读取
                " phone=" + configBeanProp.getPhone() +
                " , wife=" + configBeanProp.getWife();
    }
}

运行结果如下:

GitHub:GitHub - dkbnull/SpringBootDemo: SpringBootDemo

微信:Spring Boot入门:读取properties配置文件中的数据

微博:Sina Visitor System

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot读取properties配置文件中的数据 的相关文章

  • 使用spring自动装配时如何传递构造函数参数?

    我们的项目使用 spring DI IoC 所以我使用自动装配来注入 beans 程序在实例化期间需要将参数传递给对象 并且参数是在运行时 而不是在编译时 知道的 如何在使用自动装配时实现这一点 示例代码如下 界面 IMessage pac
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 使用Spring将war文件WEB-INF目录下的资源导入到applicationContext文件中

    我在我的项目中使用 Spring 框架 我想导入下面的所有 xml 资源 文件 WEB INF CustomerService spring integration Jobs applicationContext配置文件中war文件的目录
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 如何在 Spring 中从 application.properties 重新加载 @Value 属性? [复制]

    这个问题在这里已经有答案了 我有一个spring boot应用 在run文件夹下 有一个额外的配置文件 dir config application properties 当应用程序启动时 它使用文件中的值并将它们注入到 Value my
  • Spring REST 控制器返回带有空数据的 JSON [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个简单的 Spring Boot Web 应用程序 我正在尝试从服务器接收一些数据 控制器返回一个集合 但浏览器收
  • 基本 NASM 引导程序

    我最近一直在研究操作系统 启动过程和 NASM 在我的旅程中 我遇到了一段有用的引导代码 我部分理解并通过虚拟软盘对其进行了测试 我的基本问题是我不明白其中一些行的作用 我已经评论了我认为这些线条的作用 任何更正或确认将不胜感激 This
  • 如何从单独的 Jars 加载 @Configuration 类

    我有一个 SpringBoot 主应用程序 以及一个单独的 Maven 模块项目 该项目编译为单独的 Jar 该模块有一个 Spring 配置类 注释为 Configuration 我想在主应用程序加载时加载它 显然 这并不是开箱即用的 只
  • ModelAndView 和 ModelMap 有什么区别? [复制]

    这个问题在这里已经有答案了 Is ModelMap只是 Spring 3 中的新名称ModelAndView Spring 3 中的功能有变化吗 在 Spring 3 应用程序中考虑使用以下代码ModelMap RequestMapping
  • 无法加载驱动程序类 org.mariadb.jdbc.Driver

    我想在 Spring Boot 中配置 2 个 JNDI 数据源 我尝试了这个配置 应用程序属性 spring production datasource jndi name java global production gateway s
  • Spring-boot中将redis-cache反序列化为对象的问题

    我在 Client 类中使用 JsonNode 来处理 MySQL 8 数据库中 JSON 类型的字段 即使对于 API 请求 它也能很好地工作 但是当我使用 Redis 启用缓存 我确实需要它 时 我注意到 Redis 无法序列化 Jso
  • @OneToMany 与 @JoinTable 错误

    我试图理解 OneToMany with JoinTable 对于这样的场景 我正在使用 JPA 2 1 Hibernate 5 0 4 和 Oracle 11 XE 当我打电话时userDao save user 下面的代码 我有 jav
  • 闭包存储属性初始化有什么好处?

    初始化类的属性时 此代码有什么区别以及优点 缺点 1 let menuBar MenuBar let mb MenuBar return mb and 2 let menuBar MenuBar 两个代码片段都声明并初始化存储的属性 htt
  • Spring MVC 从 HttpServletResponse 相对重定向

    鉴于这种相对重定向到另一个控制器的方法 Controller RequestMapping someController public class MyController RequestMapping redirme public Str
  • 是否可以@Lazy 初始化Spring @Value?

    是否有可能 Lazy初始化一个Spring Value e g Lazy Value someConfig private String someConfig 我特别提到的场景是通过 JNDI 设置的变量 并且一个嵌入式 Tomcat 容器
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 如何在 Spring-JUnit 测试中设置 JNDI 查找?

    我正在使用 Maven 3 0 3 Spring 3 1 0 RELEASE 和 JUnit 4 8 1 如何在容器外部创建 JNDI 功能 在我的例子中是 JBoss 我认为 Spring 的 jndiTemplate 可以解决这个问题
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 非 Spring 托管类中 DI 的编译时编织

    我想为标记为的类配置编译时编织 Configurable注释能够将 spring 依赖项注入到初始化的类中new操作员 我不想使用加载时编织 因为我无权访问应用程序服务器的运行脚本 因此无法修改它 另外 我希望能够在测试中使用此类 我的意思

随机推荐