当前位置: 首页 > article >正文

java开发中#和$的区别

在Spring框架中,$# 是两种不同的表达式前缀,用于从不同的来源获取值或执行计算。下面详细解释它们的区别和用法:

一、$ 占位符(Property Placeholder)

1. 作用
  • 配置文件(如 application.propertiesapplication.yml)、环境变量系统属性中获取值。
  • 语法:${property.key}
2. 示例
@Value("${app.name}")        // 从配置文件中获取值
private String appName;      // 对应配置:app.name=MyApp@Value("${server.port:8080}") // 使用默认值(若配置不存在)
private int port;            // 若server.port未定义,默认8080@Value("${JAVA_HOME}")       // 获取系统环境变量
private String javaHome;
3. 配置文件示例
# application.properties
app.name=MyApp
server.port=8081

二、# SpEL表达式(Spring Expression Language)

1. 作用
  • 执行动态表达式计算,支持方法调用、属性访问、算术运算等。
  • 可以引用其他Bean、系统属性或环境变量。
  • 语法:#{expression}
2. 示例
@Value("#{systemProperties['java.version']}")  // 获取系统属性
private String javaVersion;@Value("#{new java.util.Date()}")             // 创建新对象
private Date currentDate;@Value("#{mathService.pi * 2}")               // 引用其他Bean的属性/方法
private double circleLength;@Value("#{environment.getProperty('app.name')}") // 获取环境变量
private String envAppName;@Value("#{'${app.name}'.toUpperCase()}")      // 组合使用:先获取配置值,再转换为大写
private String upperCaseName;

三、核心区别对比

对比项${...}#{...}
名称属性占位符(Property Placeholder)SpEL表达式(Spring Expression Language)
主要用途从配置文件、环境变量获取值执行动态表达式计算
支持计算不支持(只能获取原始值)支持(如 #{1 + 2}, #{bean.method()}
引用其他Bean不支持支持(如 #{dataSource.url}
默认值支持(如 ${key:default}不直接支持(需用 ?: 操作符)

四、常见组合用法

1. 在SpEL中引用配置值
@Value("#{'${app.name}'.toUpperCase()}")  // 先获取配置值,再转为大写
private String upperCaseName;@Value("#{${app.timeout} * 2}")           // 先获取配置值,再进行计算
private long doubleTimeout;
2. 复杂表达式
@Value("#{systemProperties['os.name'].contains('Windows') ? 'C:/temp' : '/tmp'}")
private String tempDir;  // 根据操作系统动态选择临时目录

五、注意事项

  1. 语法错误

    • @Value("${app.name") 缺少右括号,会导致解析错误。
    • 正确写法:@Value("${app.name}")@Value("#{bean.property}")
  2. 转义字符

    • 若需要在值中包含 $#,需使用 \ 转义:
      @Value("\\${literal.value}")  // 注入字符串 "${literal.value}"
      
  3. 生效时机

    • ${...}Bean创建时替换为实际值。
    • #{...}表达式计算时动态求值。

总结

  • ${...}:用于从配置文件、环境变量中获取静态值。
  • #{...}:用于执行动态表达式计算,支持更复杂的逻辑。

在实际开发中,两者经常结合使用,例如先通过 ${...} 获取配置值,再通过 SpEL 进行加工处理。

http://www.lryc.cn/news/2394510.html

相关文章:

  • 在 RK3588 上通过 VSCode 远程开发配置指南
  • OpenHarmony标准系统-HDF框架之音频驱动开发
  • HTML Day03
  • 篇章六 数据结构——链表(二)
  • Python60日基础学习打卡Day39
  • 吴恩达MCP课程(3):mcp_chatbot
  • MySQL访问控制与账号管理:原理、技术与最佳实践
  • AWS 创建VPC 并且添加权限控制
  • langchain学习 01
  • 【清晰教程】查看和修改Git配置情况
  • JAVA 常用 API 正则表达式
  • 光电设计大赛智能车激光对抗方案分享:低成本高效备赛攻略
  • Python实现P-PSO优化算法优化BP神经网络回归模型项目实战
  • Microsoft的在word中选择文档中的所有表格进行字体和格式的调整时的解决方案
  • C++23:关键特性与最新进展深度解析
  • Rust并发编程实践指南
  • Kubernetes资源申请沾满但是实际的资源占用并不多,是怎么回事?
  • 鲲鹏Arm+麒麟V10 K8s 离线部署教程
  • PGSQL结合linux cron定期执行vacuum_full_analyze命令
  • php 中使用MQTT
  • C#定时器深度对比:System.Timers.Timer vs System.Threading.Timer性能实测与选型指南
  • go的select多路复用
  • 深度理解与剖析:前端声明式组件系统
  • 解决8080端口被占问题
  • 介绍一种LDPC码译码器
  • 3DMAX+Photoshop教程:将树木和人物添加到户外建筑场景中的方法
  • 【IOS】【OC】【应用内打印功能的实现】如何在APP内实现打印功能,连接本地打印机,把想要打印的界面打印成图片
  • 随记 配置服务器的ssl整个过程
  • 数据库高可用架构设计:集群、负载均衡与故障转移实践
  • Correlations氛围测试:文本或图像的相似度热图