Spring @Value(“#{}“)和@Value(“${}“)

本文详细介绍了Spring框架中@Value注解的使用,包括$符号用于从配置文件中获取属性值,如`${jdbc.url}

1前言

        以前对spring中@Value没有太注意,看到同事把这个注解用的花里胡哨,我就感觉铁子牛逼666呀,迭代版本结束了,我就对这个注解研究研究,争取也牛逼666。

2 #号和$符的不同用法

2.1  $符的用法

总的来说就是:用于获取配置文件中的属性值;

2.1.1简单用法:

通常用于获取写在application.properties中的内容,例如在配置文件中:

jdbc.driverClass=com.mysql
jdbc.url=3306@local
jdbc.user=admin
  则在类中可以通过@Value("${jdbc.url}")来获取相应的值
 例如:
    @Value("${jdbc.url}")
    private String url;

2.1.2  冒号的用途

@Value("${jdbc.url:}")  

解释说明:我们有时候也是看到有人这样写的,这样写表示的意思是  如果配置文件中没有配置jdbc.url 变量,则取空值,而不是抛错

3.1  #号的用法

一句话表述:是SpEL表达式的值,可以表示常量的值,或者获取bean中的属性

3.1.1简单用法

@Value("#{1}")
    private String num;  //num=1


@Value("#{dataSource.url}") //获取bean的属性,bean(对象)为dataSource,属性为url
	private String jdbcUrl;

3.2 #号和$的组合用法

3.2.1举例

  • 配置文件

  •  代码读取
@Value("#{'${test.list}'.split(',')}")
    private List<String> testList;  //testList = [1, 2, 3, 4, 5, 6]

//  用:(冒号)时,当test.list.empty为null
 @Value("#{'${test.list.empty:}'.split(',')}")
    private List<String> testListEmpty;  //testListEmpty = []

 从上面的【代码读取】中可以看出当用  :(冒号),test.list.empty 可以不配置,但是用属性testListEmpty不为null,为空数组;下面代码解决此种情况。

@Value("#{'${test.list.empty:}'.empty ? null : '${test.list.empty:}'.split(',')}")  
private List<String> testList;  // null

 4.1完结

### 正确使用 @Value# $ 的组合方式 在编程中,`@Value` 注解主要用于 Spring 框架中的依赖注入,而 `#` `$` 则分别在 SpEL(Spring Expression Language)动态 SQL(如 MyBatis)中有特定的用途。以下是它们的详细用法注意事项: #### 1. 使用 `@Value` 注入集合与数组 `@Value` 注解可以用于注入基本类型、集合类型以及数组类型的属性值。通过逗号分隔的方式指定多个值,并结合 Spring 表达式语言(SpEL)实现复杂逻辑。 ```java @Value("${list.values}") private List<String> listValues; @Value("${array.values}") private String[] arrayValues; ``` 这里的 `${}` 是占位符语法,表示从配置文件(如 `application.properties` 或 `application.yml`)中读取对应的值[^1]。 #### 2. 在 SpEL 中使用 `#` `#` 是 SpEL 的标识符,用于引用方法参数或上下文中的变量。以下是一个示例,展示如何结合 `@Value` `#` 使用: ```java @Value("#{T(java.lang.Math).random() * 100}") private double randomValue; ``` 上述代码通过 SpEL 调用了 `Math.random()` 方法,并将其结果乘以 100 后注入到 `randomValue` 属性中[^1]。 #### 3. 在 MyBatis 中使用 `$` `$` 在 MyBatis 动态 SQL 中直接替换为对应的值,不进行预编译。这使得它适用于需要拼接字符串的场景,例如 `order by` 子句。 ```sql <select id="selectStudents" resultType="Student"> SELECT * FROM students ORDER BY ${sortColumn}; </select> ``` 如果使用 `#{}`,则会导致字段名被包裹在引号中,从而引发语法错误[^2]。 #### 4. 组合使用示例 以下是一个综合示例,展示如何在 Spring MyBatis 中组合使用 `@Value`、`#` `$`: ##### Spring 配置 ```java @Component public class ConfigBean { @Value("#{${app.config.base} + T(java.lang.System).currentTimeMillis()}") private long dynamicTimestamp; @Value("${db.columns}") private List<String> dbColumns; } ``` - `${app.config.base}` 从配置文件中读取基础值。 - `T(java.lang.System).currentTimeMillis()` 调用系统方法生成时间戳。 - `dbColumns` 是一个从配置文件中读取的列名列表[^1]。 ##### MyBatis 查询 ```xml <select id="findRecords" resultType="Record"> SELECT ${columns} FROM records WHERE status = #{status} ORDER BY ${orderBy} </select> ``` - `${columns}` 直接替换为查询字段列表。 - `#{status}` 是预编译占位符,防止 SQL 注入。 - `${orderBy}` 替换为排序字段名[^2]。 ### 注意事项 - 使用 `$` 时需格外小心,因为它会直接将值插入 SQL 中,可能导致 SQL 注入风险。 - `#` 更安全,适用于大多数场景,尤其是需要预编译的参数。 - `@Value` 支持 SpEL,但其表达式的复杂度应适度,避免过度嵌套导致可读性下降。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值