Spring @Value注解使用${}进行注入

本文深入解析了在Spring MVC中使用@Value注解从.properties配置文件注入属性的方法,包括如何配置ApplicationContext、建立配置文件以及在Controller中使用注解获取配置项内容。
原文:[url]http://my.oschina.net/js99st/blog/632104[/url]
spring3中新增的@value注解 [url]http://bijian1013.iteye.com/blog/2024068[/url],[color=red]这里成功配置[/color]

[color=red]controller读取不到的原因[/color]: [url]http://cdn.verydemo.com/demo_c143_i7726.html[/url]

我在之前的项目中一直使用下面的格式注入:
 @Value("#{config['redis.host']}")
private String redisHost;

使用下面的方式注入总是不成功。
 @Value("${redis.host}")
private String redisHost;

最近终于发现,扫描配置文件的语句:
<context:property-placeholder location="classpath*:/xxx.properties" />

要交给springMVC的DispatcherServlet去扫描,而不是spring的监听器ContextLoaderListener去扫描,就可以比较方便的使用“${xxx}”去注入。


[color=red][b]
详细配置:[/b][/color]
Spring MVC 通过@Value注解读取.properties配置内容,@value.properties

第一步:

在applicationContext.xml配置:

1 <bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
2 <property name="locations">
3 <list>
4 <value>classpath:/config/*.properties</value>
5 </list>
6 </property>
7 </bean>
8 <bean id="[color=red][b]propertyConfigurer[/b][/color]" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
9 <property name="properties" ref="configProperties" />
10 </bean>
第二步:

建立配置文件内容:

例如:userPageSize=5

第三步:

在Controller中使用注解获得配置项内容:

1 @Value("#{[b][color=red]configProperties[/color][/b]['userPageSize']}")
2 private String userPageSize;
第四步:

后面的代码就可以使用userPageSize这个私有变量了,这个字符串的值就是我们配置文件中配置的5.
<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. **不可变性**:注入后避免修改静态变量值
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值