5 个 springboot配置文件注入参数说明

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 5 个 springboot配置文件注入参数说明

在SpringBoot中注入各种类型(String,List,Map,Object)配置

背景

在开发过程中,绝大多数场景都是要使用一些配置项的。至于配置项如何注入到应用程序中,一直没有过多的关注过。今天抽了点时间实际试了下,这里做个简单的记录,便于需要的朋友了解下。

在下面的讲述中,针对下面的一组配置来进行说明,分别演示读取字符串String、列表List、哈希表Map和对象Object进行说明。开发框架为Springboot。

config:
  str: 123456
  list:
    - 1
    - 2
    - 3
    - 4
    - 5
  map:
    1: first
    2: second
    3: third
  entity:
    key: name
    value: majing

1、String类型配置注入

对于String类型的配置,注入最简单,只要简单实用@Value注解就可以了,如下:

@Value("${config.str}")
private String strConfig;

2、List类型配置注入

对于List类型的配置,注入有两种方式,如下所示。

(1)如果在application.yaml文件中如下配置,

config:
  list:
    - 1
    - 2
    - 3
    - 4
    - 5

那么直接使用@Value注解就可以了,如下所示:

@Value("${config.list}")
private List<Integer> listConfig;

(2)如果在application.yaml文件中不是按照列表格式配置的,

config:
  list: 1,2,3,4,5

那么在使用@Value注解时需要注意,使用@Value("${config.list}")没法完成解析,这时候需要做如下修改,调用split()方法对读取的字符串值进行分隔,如果分隔符不一样,那直接替换成其他分隔符就好了。

@Value("#{'${config.list}'.split(',')}")
private List<Integer> listConfig;

3、Map类型配置注入

maps: "{key1: 'value1', key2: 'value2'}"
punishMap: "{1:7,2:7,3:30,4:30,5:1825}"

注入:

@Value("#{${maps}}")  
private Map<String,String> maps;
@Value("#{${punishMap:}}")
private Map<Integer, Integer> punishMap;

注意上面的map解析中,一定要用""把map所对应的value包起来,要不然解析会失败,导致不能转成 Map<String,String>。

4、实体类注入

@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "config")
public class Config {
    private String str;
    private List<Object> list;
    private Map<String,String> map;
    public String getStr() {
        return str;
    }
    public void setStr(String str) {
        this.str = str;
    }
    public List<Object> getList() {
        return list;
    }
    public void setList(List<Object> list) {
        this.list = list;
    }
    public Map<String, String> getMap() {
        return map;
    }
    public void setMap(Map<String, String> map) {
        this.map = map;
    }
}

在这个配置实体类中,我们定义了String类型、List类型和Map类型字段,然后在Config类上使用@ConfigurationProperties(prefix = “config”)注解来指出该实体类对应的配置项前缀是application.yaml中config开头的配置项,配置项如下:

config:
  str: 123456
  list:
    - 1
    - 2
    - 3
    - 4
    - 5
  map: {1: first, 2: second, 3: third}

或者如下配置:

config:
  str: 123456
  list:
    - 1
    - 2
    - 3
    - 4
    - 5
  map:
    1: first
    2: second
    3: third

需要说明的是List类型必须按照上述配置,否则没法解析。

通过简单的测试接口,我们可以看到配置已经正确的注入了。

Config{str='123456', list=[1, 2, 3, 4, 5], map={1=first, 2=second, 3=third}}

5、静态属性注入

直接用@Value()的方式不能注入值, 要用set注入

@Component
public class OrderNoUtil {
    // B3230651812529
    private static String[] yearCodes;
    private static Integer beginYear;
    @Value("${missyou.year-begin}")
    private void setBeginYear(Integer beginYear) {
        OrderNoUtil.beginYear = beginYear;
    }
    @Value("${missyou.year-codes}")
    public void setYearCodes(String yearCodes) {
        OrderNoUtil.yearCodes = yearCodes.split(",");
    }
    public static String makeOrderNo() {
        StringBuilder joiner = new StringBuilder();
        Calendar calendar = Calendar.getInstance();
        String mills = String.valueOf(calendar.getTimeInMillis());
        String micro = LocalDateTime.now().toString();
        String random = String.valueOf(Math.random() * 1000).substring(0, 2);
        joiner.append(OrderNoUtil.yearCodes[calendar.get(Calendar.YEAR) - OrderNoUtil.beginYear])
                .append(Integer.toHexString(calendar.get(Calendar.MONTH) + 1).toUpperCase())
                .append(calendar.get(Calendar.DAY_OF_MONTH))
                .append(mills.substring(mills.length() - 5))
                .append(micro.substring(micro.length() - 3))
                .append(random);
        return joiner.toString();
    }
}

欢迎大家留言指导。

目录
相关文章
|
2月前
|
Java Spring
Spring boot 运行服务jar外配置配置文件方式总结
Spring boot 运行服务jar外配置配置文件方式总结
400 0
|
3月前
|
Java
springboot字段注入@value细节
springboot字段注入@value细节
|
3月前
|
Java
springboot自动注入避坑
springboot自动注入避坑
|
4月前
|
Java Spring
SpringBoot接收参数的方式
本文介绍了Java Spring Boot中处理GET请求的多种方式。可以使用方法参数直接接收,或者通过`@RequestParam`注解指定必传参数。此外,可以用实体类接收多个相关参数,但不能同时使用`@RequestParam`。还可以通过`HttpServletRequest`对象获取参数,或利用`@PathVariable`接收路径变量。对于数组和集合参数,需注意使用`@RequestParam`注解。
190 1
|
1月前
|
Java API 数据格式
Spring Boot API参数读取秘籍大公开!6大神器助你秒变参数处理大师,让你的代码飞起来!
【8月更文挑战第4天】Spring Boot凭借其便捷的开发和配置特性,成为构建微服务的热门选择。高效处理HTTP请求参数至关重要。本文介绍六种核心方法:查询参数利用`@RequestParam`;路径变量采用`@PathVariable`;请求体通过`@RequestBody`自动绑定;表单数据借助`@ModelAttribute`或`@RequestParam`;请求头使用`@RequestHeader`;Cookie则依靠`@CookieValue`。每种方法针对不同场景,灵活运用可提升应用性能与用户体验。
44 9
|
22天前
|
缓存 Java 数据库连接
Spring Boot 资源文件属性配置,紧跟技术热点,为你的应用注入灵动活力!
【8月更文挑战第29天】在Spring Boot开发中,资源文件属性配置至关重要,它让开发者能灵活定制应用行为而不改动代码,极大提升了可维护性和扩展性。Spring Boot支持多种配置文件类型,如`application.properties`和`application.yml`,分别位于项目的resources目录下。`.properties`文件采用键值对形式,而`yml`文件则具有更清晰的层次结构,适合复杂配置。此外,Spring Boot还支持占位符引用和其他外部来源的属性值,便于不同环境下覆盖默认配置。通过合理配置,应用能快速适应各种环境与需求变化。
27 0
|
23天前
|
安全 Java 开发者
开发者必看!@Resource与private final的较量,Spring Boot注入技巧大揭秘,你不可不知的细节!
【8月更文挑战第29天】Spring Boot作为热门Java框架,其依赖注入机制备受关注。本文通过对比@Resource(JSR-250规范)和@Autowired(Spring特有),并结合private final声明的字段注入,详细探讨了两者的区别与应用场景。通过示例代码展示了@Resource按名称注入及@Autowired按类型注入的特点,并分析了它们在注入时机、依赖性、线程安全性和单一职责原则方面的差异,帮助开发者根据具体需求选择最合适的注入策略。
30 0
|
1月前
|
Java 测试技术 Spring
Java SpringBoot 加载 yml 配置文件中字典项
Java SpringBoot 加载 yml 配置文件中字典项
27 0
|
2月前
|
Java 测试技术 Spring
支付系统15-----支付宝支付,引入支付参数,如何使支付宝的配置信息变成SpringBoot相关的配置信息
支付系统15-----支付宝支付,引入支付参数,如何使支付宝的配置信息变成SpringBoot相关的配置信息