用@Value注解直接注入properties中的值

本文详细解析了Spring框架中@Value注解的两种使用方式,包括如何通过@Value(${key}
部署运行你感兴趣的模型镜像

有两种方式可以实现@Value注解直接将properties中的值注入变量,一种是@Value("${key}"),一种是@Value("#{beanName[key]}"),他们本质上是实现了不同的类

@Value("${key}"),实现PropertyPlaceholderConfigurer

demo:https://blog.youkuaiyun.com/lyz_112233/article/details/83105165

https://blog.youkuaiyun.com/lyz_112233/article/details/83105165

https://blog.youkuaiyun.com/qing_mei_xiu/article/details/53537409

1配置properties配置文件(在applicationContext中):

  • 使用<context:property-placeholder >标签,要配置多个properties文件则使用多个标签
<context:property-placeholder location="classpath:xxx.properties"
    ignore-unresolvable="true" />
  • 使用PropertyPlaceholderConfigurer配置,这样可以在list中配置多个properties文件
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

   <property name="locations">

      <list>

        <value>classpath:jdbc.properties</value>

      </list>

   </property>

</bean>

 

2、Client类中Annotation的使用:

  • 注释变量,对变量值进行注入:
@Value("${server.ip}")
private String ip;
  • 注释方法,对输入值进行注入(set方法不能是static的):
@Value("${getToken}")

private void setTokenUrl(String tokenUrl) {

this.tokenUrl = tokenUrl;

}

 

二、@Value("#{beanName[key]}"),实现PropertiesFactoryBean

demo:https://blog.youkuaiyun.com/w605283073/article/details/49203141

1配置properties配置文件:可以将配置整体赋给Properties类型的类变量,也可以取出其中的一项赋值给String类型的类变量

  • <util:properties/> 标签

<util:properties/> 标签只能加载一个文件,当多个属性文件需要被加载的时候,可以使用多个该标签

  • 使用PropertiesFactoryBean配置

<!-- <util:properties/> 标签的实现类是PropertiesFactoryBean,  

 直接使用该类的bean配置,设置其locations属性可以达到一个和上面一样加载多个配置文件的目的 -->  

 <bean id="settings"   

   class="org.springframework.beans.factory.config.PropertiesFactoryBean">  

   <property name="locations">  

  <list>  

    <value>file:/opt/rms/config/rms-mq.properties</value>  

    <value>file:/opt/rms/config/rms-env.properties</value>  

  </list>  

   </property>  

 </bean>  

</beans> 

 

2Client类中Annotation的使用,有三种方式:

  • 使用@Value("#{remoteSettings['remote.ip']}")  来注释一个string类型对象
  • 使用@Value("#{remoteSettings}")  来注释一个Properties对象
  • 使用第二种配置方式还可以使用@Autowired对Properties对象进行注入

 

  • 如果class的静态变量值(static)是获取不到值的

*注意,不管是哪种注入方式,变量都不能被static和final修饰,否则会出现变量获取不到值的情况

如果变量必须是static的,那么可以通过非static的setter方法来进行注入,此时@Value必须修饰在方法上,且set方法不能有static :

private static String CLUSTER_NAME;

@Value("${ES.CLUSTER_NAME}")

public void setClusterName(String clusterName) {

CLUSTER_NAME = clusterName;

}

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think> 在Spring中,`@Value`注解通常用于注入非静态字段,因为Spring的依赖注入是基于对象的实例(通过setter或字段注入)。如果直接对静态变量使用`@Value`,注入不会生效,因为Spring不会处理静态字段的注入。 但是,可以通过在非静态的setter方法上使用`@Value`注解,并在该方法中设置静态变量的来实现静态变量的注入。 具体步骤如下: 1. 创建一个非静态的setter方法,该方法使用`@Value`注解。 2. 在setter方法中,将参数赋给静态变量。 示例代码: ```java import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class MyComponent { private static String staticProperty; // 非静态setter方法,使用@Value注入 @Value("${my.static.property}") public void setStaticProperty(String value) { staticProperty = value; } public static String getStaticProperty() { return staticProperty; } } ``` 在上面的代码中,`@Value("${my.static.property}")`会从配置文件中读取`my.static.property`的,然后通过非静态方法`setStaticProperty`将赋给静态变量`staticProperty`。 注意:这种方法要求`MyComponent`类必须是一个Spring管理的Bean(例如使用`@Component`注解),这样Spring容器在初始化时才会调用setter方法。 另一种方式是使用`@PostConstruct`注解: ```java import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @Component public class MyComponent { private static String staticProperty; @Value("${my.static.property}") private String property; @PostConstruct public void init() { staticProperty = property; } public static String getStaticProperty() { return staticProperty; } } ``` 这种方式在Bean初始化完成后,通过`@PostConstruct`注解的`init`方法将注入的实例变量`property`赋给静态变量`staticProperty`。 需要注意的是,静态变量在Spring容器启动后被赋,因此不能在静态上下文中过早使用(例如在静态代码块中使用),因为那时还没有被注入。 另外,这种方法不是线程安全的,如果多个实例存在(例如scope不是singleton),可能会出现问题。但是在Spring中,默认的scope是singleton,通常不会有多个实例,所以相对安全。 总结:Spring不支持直接注入静态变量,但可以通过非静态方法间接设置静态变量的。 §§相关问题§§: 1. Spring中的`@Value`注解除了从配置文件读取,还有哪些用法? 2. 在Spring中如何使用`@PostConstruct`和`@PreDestroy`注解? 3. Spring中如何注入静态工具类? 4. 如何确保静态变量在Spring容器启动后立即可用? </think> ### 使用 Spring 的 `@Value` 注入静态变量 在 Spring 中,`@Value` 注解默认不能直接注入静态变量,因为 Spring 的依赖注入是基于对象的实例而不是类。但可以通过以下方法实现静态变量的注入: #### 解决方案 1:使用 setter 方法注入(推荐) ```java import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class AppConfig { private static String apiKey; // 非静态的 setter 方法 @Value("${api.key}") public void setApiKey(String value) { apiKey = value; // 静态变量赋 } public static String getApiKey() { return apiKey; } } ``` **解释:** 1. 创建非静态的 setter 方法,使用 `@Value` 注解注入 2. 在 setter 方法中将赋给静态变量 3. 提供静态访问方法获取 4. 需要确保类被 Spring 管理(添加 `@Component`) #### 解决方案 2:使用 `@PostConstruct` 初始化 ```java import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @Component public class AppConfig { private static String apiKey; @Value("${api.key}") private String tempApiKey; @PostConstruct public void init() { apiKey = tempApiKey; // 在初始化后赋给静态变量 } public static String getApiKey() { return apiKey; } } ``` **解释:** 1. 注入到非静态字段 `tempApiKey` 2. 在 `@PostConstruct` 方法中将赋给静态变量 3. Spring 容器初始化完成后自动执行初始化 #### 解决方案 3:使用静态访问器(进阶) ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; @Configuration public class StaticValueInjector { private static String apiKey; // 通过构造器注入 @Autowired public StaticValueInjector(@Value("${api.key}") String apiKeyValue) { StaticValueInjector.apiKey = apiKeyValue; } public static String getApiKey() { return apiKey; } } ``` **解释:** 1. 使用 `@Configuration` 标记为配置类 2. 通过构造器注入并赋给静态变量 3. 提供静态访问方法 --- ### 使用示例 **application.properties:** ``` api.key=SECRET_12345 ``` **代码调用:** ```java public class ApiService { public void callApi() { String key = AppConfig.getApiKey(); // 获取静态 System.out.println("Using API Key: " + key); } } ``` --- ### 注意事项: 1. **初始化顺序**:静态变量的注入发生在 Spring 容器初始化阶段,不要在静态初始化块中使用 2. **线程安全**:确保在单线程环境中初始化(Spring 默认单例) 3. **测试**:在单元测试中需要使用 `@SpringBootTest` 加载上下文 4. **作用域**:静态变量是全局共享的,谨慎使用 5. **不可变性**:注入后避免修改静态变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值