SpringBoot 值的注入以及 EL 表达式

本文深入探讨了Spring框架中属性注入的多种方式,包括通过@PropertySource引用属性文件、使用SpringEL表达式注入不同类型的参数,如操作系统属性、表达式运算结果、其他bean的属性等。同时介绍了如何将properties文件中的属性注入为Bean对象。

spring 注入外部的值

在spring 中 处理外部值的最简单的方式是通过声明属性源并且通过松日那个的 environment 来检索属性 通常是使用@PropertySource 引用文件名和文件路径 。 这样这个属性文件就会被加载到spring的environment中 在需要使用属性的地方通过调用 getProperty 来获取 environment 中的属性值

    @Autowired
    private ApplicationContext applicationContext;
   String property = applicationContext.getEnvironment().getProperty("user.name");

spring boot 将properties 文件中的属性注入为一个Bean 对象

@Configuration
@PropertySource(value = "classpath:config/user.properties")
@ConfigurationProperties(prefix = "user")
public class UserPropertiesConfig {
    private String name;
    private int age;
    private String password;
    }

通过注入 UserPropertiesConfig 来获取属性

Spring EL 表达式

Spring 开发中经常涉及调用各种资源的情况,包括普通文件,网址,配置文件,环境变量。使用spring 表达式语言实现资源的注入 ,能够以一种强大和简单的方式将值装配到bean 属性和构造器中,
spring EL 的特性

  1. 使用bean 的id 来引用bean
  2. 调用方法和访问对象的属性
  3. 对值进行算术,关系 和逻辑运算
  4. 正则表达式匹配
  5. 集合操作

spring主要在@value 的参数中使用表达式
@value可注入以下参数:

  1. 普通字符
    @Value(“12”)
    private String str;

2.操作系统属性
@Value("#systemProperties[‘os.name’]")
private String osName;
@Value("#{systemProperties[‘os.name’]}")
private static String osName;

3.表达式运算结果。

4.其他bean的属性
@Value("#UserServer.name")

5.文件内容
@Value(“classpath:test.txt”)
private Resource testFile;
6.网址内容
@Value(“http://www.baidu.com”)
private Resource testUrl;

7.属性文件
@value("${book.name}")
private String bookName;
github url:springbootcustomproperties

### 使用Spring Boot中的EL表达式 在Spring Boot项目里,可以利用Spring Expression Language (SpEL) 来简化配置以及动态计算属性。通过`${}`和`#{}`两种方式来使用表达式。 对于简单的字符串替换或是读取环境变量等场景下,通常会采用`${key}`的形式,在这里`key`代表的是application.properties或application.yml文件里的键名[^3]。例如: ```properties app.name=MyApp server.port=${port:8080} ``` 上述例子展示了如何定义一个应用程序名称,并设置服务器端口,默认情况下如果未指定外部传入的`port`参数,则监听于8080端口上。 而当涉及到更复杂的逻辑运算或者是访问Java Bean内的方法与字段时,则需要用到`#{}`这种形式的表达式。这允许执行更为丰富的操作,比如算术运算、关系判断甚至是调用静态函数等等[^1]。 下面是一个具体的实例展示怎样在一个控制器类中注入经过计算后的数作为成员变量: ```java import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; @Controller public class MyController { @Value("#{ T(java.lang.Math).random() * 100 }") private double randomNumber; // getter and setter... } ``` 这段代码片段说明了如何借助`T()`关键字引入Math工具类并随机生成一个小数乘以一百的结果赋给`randomNumber`属性。 此外,还可以结合条件语句实现更加灵活的功能控制。假设存在如下配置项用于决定是否开启某特性开关: ```yaml feature: enabled: true ``` 那么可以在组件内部这样写: ```java @ConditionalOnExpression("${feature.enabled:false}") @Component public class FeatureComponent { public void doSomething(){ System.out.println("Feature is ON"); } } ``` 此处在注解处使用的`${feature.enabled:false}`表示如果没有找到对应的配置则默认关闭该功能模块;只有当YAML文件内确实设定了`true`才会加载此类到上下文中去。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值