结合SpEL使用Value基于配置文件或非配置的文件的值注入Spring-Boot

43次阅读

共计 2616 个字符,预计需要花费 7 分钟才能阅读完成。

本文次要介绍 Spring @Value 注解注入属性值的应用办法的剖析,文章通过示例代码十分具体地介绍,对于每个人的学习或工作都有肯定的参考学习价值

在应用 spring 框架的我的项目中,@Value 是常常应用的注解之一。其性能是将与配置文件中的键对应的值调配给其带注解的属性。在日常应用中,咱们罕用的性能绝对简略。本文使您系统地理解 @Value 的用法。

@Value 注入模式

依据注入的内容起源,@ Value 属性注入性能能够分为两种:通过配置文件进行属性注入和通过非配置文件进行属性注入。

非配置文件注入的类型如下:

  • 注入一般字符串
  • 注入操作系统属性
  • 注射表白后果
  • 注入其余 bean 属性
  • 注入文件资源
  • 注入 URL 资源

基于配置文件的注入

首先,让咱们看一下配置文件中的数据注入,无论它是默认加载的 application.properties 还是自定义 my.properties 文档(须要 @PropertySource 额定加载)。例如:application.properties 属性值以以下模式定义:

user.name=admin

my.properties 配置文件中定义的属性如下:

user.password=pwd123

而后,在 bean 中应用 @Value,如下所示:

@PropertySource("classpath:my.properties")
@RestController
public class ValueController {

  /**
   *Get in application.properties Properties configured in
   */
  @Value("${user.name}")
  private String name;

  /**
   *Get in my.properties Configuration properties in
   */
  @Value("${user.password}")
  private String password;

}

区别在于,在 spring boot 我的项目中,如果应用 my.properties 文件,则须要通过类中的 @ PropertySource 导入配置文件,而 application.properties 中的属性将主动加载。

同时,您不仅能够通过 @Value 注入单个属性,还能够采纳数组和列表的模式。例如,配置如下:

tools=car,train,airplane

能够通过以下形式注入它:

/**
 *Injection array (automatically split according to ",")
 */
@Value("${tools}")
private String[] toolArray;

/**
 *Injection list form (automatic segmentation based on "," and)
 */
@Value("${tools}")
private List<String> toolList;

默认状况下,spring 将以“,”宰割,并将其转换为相应的数组或列表。

基于非配置文件的注入

在应用示例阐明基于非配置文件注入属性的实例之前,让咱们看一下 SpEl。

Spring Expression Language 是 Spring 表达式语言,能够在运行时查问和操作数据。应用#{…}作为操作符号,大括号中的所有字符均视为 SpEl。

让咱们看一下特定实例场景的利用:

/**
 * 实例化一个字符串,并赋予默认值
 */
@Value
private String wechatSubscription;

/**
 * 读取零碎的环境变量
 */
@Value("#{systemProperties['os.name']}")
private String systemPropertiesName;

/**
 * 注入表达式计算结果
 */
@Value("#{ T(java.lang.Math).random() * 100.0}")
private double randomNumber;

/**
 * 读取一个 bean:config 的 tool 属性并注入
 */
@Value("#{config.tool}")
private String tool;

/**
 * 将 words 用“|”分隔为字符串数组
 */
@Value("#{'${words}'.split('\|')}")
private List<String> numList;

/**
 * 注入一个文件资源
 */
@Value("classpath:config.xml")
private Resource resourceFile;

/**
 * 注入 URL 资源
 */
@Value("http://www.choupangxia.com")
private URL homePage;

下面的示例显示了以下计划的应用:

  1. 间接注入字符串等效于实例化时间接初始化字符串。初始化空串
  2. 通过#{}注入零碎变量。
  3. 表达式计算结果通过#{}注入。
  4. 通过#{}注入其余 bean 的属性。
  5. 通过 {} 和 $ {}的组合注入属性,而后拆分。
  6. 注入文件资源,并将相应的字符串值转换为相应的资源文件。
  7. 注入 URL 资源并将相应的 URL 字符串转换为 URL。

默认值注入

无论应用 #{}(SpEL)还是 $ {}进行属性注入,当无奈取得相应的值时,都须要设置默认值,能够通过以下形式进行设置。

/**
 *If IP is not configured in the property, the default value is used
 */
@Value("${ip:127.0.0.1}")
private String ip;

/**
 *If the value of port is not obtained in the system properties, 8888 is used.
 */
@Value("#{systemProperties['port']?:'8888'}")
private String port;

$ {}中间接应用“:”来设置未定义或空值的默认值,而#{}则须要应用“?:”来设置未设置属性的默认值。

欢送关注我的博客,外面有很多精品合集

  • 本文转载注明出处(必须带连贯,不能只转文字):字母哥博客。

感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源!。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。

  • 《手摸手教你学 Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2 一本通》
  • 《实战前后端拆散 RBAC 权限管理系统》
  • 《实战 SpringCloud 微服务从青铜到王者》
  • 《VUE 深入浅出系列》

正文完
 0