spring @Value注解

本文介绍如何使用Spring注解方式注入properties文件内容,并演示如何利用Junit4+Spring进行单元测试。主要内容包括配置Spring读取properties文件、创建映射类及单元测试。

【转】使用Spring注解方式注入properties文件内容,并配合Junit4+Spring做单元测试

先看看工作目录,然后再来讲解

1、建立config.properties,我的config.properties内容如下:

 

author_name=luolin
project_info=该项目主要是用于写一些demo

 

 

2、配置Spring配置文件,读取properties文件,并设置编码格式。大家从我的项目结构图中可以看到我用了两个Spring的配置文件,其实在spring-context.xml中没有配置其他内容,只是配置扫描com.eya.property这个包,大家可能会有疑问为何包的扫描不直接在spring-mvc.xml中配置成扫描com.eya就可以了。其实这是一个习惯问题,不同的东西做不同的事情,在 spring-mvc.xml中我只配置了去扫描com.eya.controller这个包。

 

<!-- 使用注解注入properties中的值 -->
	<beanid="setting"class="org.springframework.beans.factory.config.PropertiesFactoryBean">
		<propertyname="locations">
			<list>
				<value>classpath:config.properties</value>
			</list>
		</property>
		<!-- 设置编码格式 -->
		<propertyname="fileEncoding"value="UTF-8"></property>
	</bean>

 

 

3、编写和 config.properties文件中的值对应的ConfigProperty.java文件。加上注解@Comopnent("configProperty")将该类交给Spring容器管理,且指定该组件的名称为configProperty。

 

这里说明一下,在使用@Value 注解的时候,其内部的格式是#{beanID[propertyKey]},这里的beanID是在第二步中配置PropertiesFactoryBean的时候指定的id值,propertyKey是和config.properties中的key对应。

 

/**
 * 
 */
package com.eya.property;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * config.properties文件映射类
 * @author luolin
 *
 * @version $id:ConfigProperty.java,v 0.1 2015年8月7日 下午2:10:44 luolin Exp $
 */
@Component("configProperty")
public classConfigProperty{

    /** 作者名字 */
    @Value("#{setting[author_name]}")
    private String authorName;
    /** 项目信息 */
    @Value("#{setting[project_info]}")
    private String projectInfo;

    /**
     * @return the authorName
     */
    public String getAuthorName() {
        return authorName;
    }

    /**
     * @param authorName the authorName to set
     */
    public void setAuthorName(String authorName) {
        this.authorName = authorName;
    }

    /**
     * @return the projectInfo
     */
    public String getProjectInfo() {
        return projectInfo;
    }

    /**
     * @param projectInfo the projectInfo to set
     */
    public void setProjectInfo(String projectInfo) {
        this.projectInfo = projectInfo;
    }

}

 

4、编写单元测试,测试是否注入成功。这里用的是Junit4 + Spring注解的方式,当做是练习。

 

/**
 * 
 */
package com.eya.property;


import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * JUnit4 + Spring 注解进行单元测试,测试通过Spring注解获得Properties文件的值
 * @author luolin
 *
 * @version $id:ConfigPropertyTest.java,v 0.1 2015年8月7日 下午2:21:26 luolin Exp $
 */
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:spring-mvc.xml","classpath:spring-context.xml"})
public class ConfigPropertyTest {

    @Resource(name = "configProperty")
    private ConfigProperty configProperty;
    
    /**
     * 测试Spring注解获取properties文件的值
     */
    @Test
    public void test() {
        System.out.println(configProperty.getAuthorName());
        System.out.println(configProperty.getProjectInfo());
    }

}

 

运行结果如图:

 

<think> 我们正在回答用户关于Spring @Value注解使用方法的问题。根据提供的引用内容,我们可以总结出以下关键点: 1. @Value注解用于将值注入到Spring管理的bean中。 2. 它可以注入常量、配置文件中的值、其他bean的属性等。 3. 注入的来源可以是属性文件(通过配置文件加载)。 4. 有两种常见的表达式: - `${property:default_value}`:用于注入外部属性,可以设置默认值。 - `#{obj.property?:default_value}`:用于SpEL表达式,可以引用其他bean的属性,并设置默认值。 5. 注意静态变量(static)和非静态变量在使用@Value注解时的区别(根据引用[2])。 我们将按照以下结构回答: 1. 基本用法:如何通过@Value注入简单值、属性文件中的值。 2. 使用SpEL表达式。 3. 默认值的设置。 4. 静态变量注入的特殊处理。 同时,我们会提供代码示例。 注意:引用[3]提到,要使用@Value注解读取属性文件,首先需要在Spring配置文件中加载属性文件(例如使用util:properties)。但在Spring Boot中,通常使用@PropertySource或默认的application.properties。 由于用户没有指定是传统的Spring XML配置还是Spring Boot,我们将分别说明。 现在开始编写回答。 </think>### Spring @Value 注解使用方法详解 Spring 的 `@Value` 注解用于将值注入到 Spring 管理的 Bean 中,支持注入常量、配置文件属性、环境变量及 SpEL 表达式等。以下是详细使用方法: #### 1. **基础注入** ```java @Component public class AppConfig { // 注入静态值 @Value("Hello World") private String staticValue; // 注入系统属性 @Value("${user.home}") private String userHome; } ``` #### 2. **注入配置文件属性** 需先在配置中加载属性文件(XML 配置示例): ```xml <util:properties id="appProps" location="classpath:application.properties"/> ``` 或使用 Spring Boot 的 `application.properties` 自动加载。 Java 代码示例: ```java @Component public class DatabaseConfig { // 注入属性值(带默认值) @Value("${db.url:jdbc:default}") private String dbUrl; // 注入数值属性 @Value("${db.timeout:30}") private int timeout; } ``` #### 3. **SpEL 表达式注入** ```java @Component public class CalculationService { // 注入其他Bean的属性 @Value("#{systemProperties['java.version']}") private String javaVersion; // 表达式计算 @Value("#{ T(java.lang.Math).random() * 100 }") private double randomNumber; } ``` #### 4. **静态变量注入的特殊处理** 静态变量需通过 setter 方法间接注入: ```java @Component public class Constants { private static String API_KEY; @Value("${api.key}") public void setApiKey(String key) { API_KEY = key; // 静态变量赋值 } } ``` #### 5. **默认值设置** 当属性不存在时提供默认值: ```java @Value("${cache.size:100}") private int cacheSize; // 若未配置则默认为100 ``` #### 6. **类型支持 自动转换基本类型和常见对象: ```java @Value("2024-01-01") private LocalDate startDate; // 需配置自定义转换器 @Value("true") private boolean enabled; ``` > **最佳实践** > - 优先使用 `application.properties` 集中管理配置 > - 敏感数据建议结合 `@ConfigurationProperties` 类型安全绑定 > - 避免在静态字段直接使用 `@Value`(需通过 setter)[^2][^4] ```mermaid graph TD A[@Value 注入] --> B[基本类型/字符串] A --> C[属性文件 ${...}] A --> D[SpEL 表达式 #{...}] C --> E[默认值设置 ${key:default}] D --> F[对象属性引用] D --> G[方法调用] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值