Spring @Value注释和setter注入差异

时间:2015-02-27 14:03:50

标签: java spring

当我使用属性文件中的@Value注释设置值时,它不起作用,而使用setter注入设置则无效。

我的属性文件就像这样。

app.work.dir=file:${user.home}/WORK

类文件如下。

@Value("#{configProperties['app.work.dir']}")
private String workdir;

这是我的xml设置。

<util:properties id="configProperties" location="classpath:config.properties" />

当使用下面的setter注入时,它可以正常工作。

<bean id="sampleService" class="aaa.SampleService">
    <property name="workdir" value="${app.work.dir}" />
</bean>

我不确定为什么,如果可能,我想使用@Value注释。

请参考下面的junit测试用例。

xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <context:property-placeholder location="classpath:testconfig.properties" />
    <util:properties id="sampleProperties" location="classpath:testconfig.properties" />

    <bean id="exampleA" class="aa.sample.SampleA" />

    <bean id="sampleB" class="aa.sample.SampleB" >
        <property name="workdir" value="${work.dir}" />
        <property name="tempdir" value="${work.dir.test}" />
        <property name="aaa" value="${aaa}" />
    </bean>


</beans>

示例服务类:

打包aa.sample;

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

@Service
public class SampleA {

    @Value("#{sampleProperties['work.dir']}")
    private String workdir;
    @Value("#{sampleProperties['work.dir.test']}")
    private String tempdir;
    @Value("#{sampleProperties['aaa']}")
    private String aaa;

    //getter setter deleted

}

属性文件:

work.dir=file:${user.home}/WORK
work.dir.test=${work.dir}/TEST
aaa=bbb

和junit测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "/testcontext.xml" })
public class ExampleTest {

    @Inject
    private SampleA sampleA;

    @Inject
    private SampleB sampleB;

    @Test
    public void testValueAnnotation() {

        assertThat(sampleA.getAaa(), is("bbb"));//ok
        String tempdir = sampleA.getTempdir();
        String workdir = sampleA.getWorkdir();
        assertFalse("[sampleA] temp dir should not have ${work.dir}", tempdir.indexOf("${work.dir}") >= 0);//ng
        assertFalse("[sampleA] workdir dir should not have ${user.home}", workdir.indexOf("${user.home}") >= 0);//ng
    }


}

1 个答案:

答案 0 :(得分:0)

生成的bean
<util:properties id="sampleProperties" location="classpath:spring.properties" />

基本上翻译成地图。这种表示法

@Value("#{sampleProperties['work.dir']}")

请求使用键work.dir映射其值之一。返回的值没有出现属性解析。这是字面上的。

另一方面,这是

<property name="tempdir" value="${work.dir.test}" />

请求一个名为work.dir.test的属性,该属性可以递归解析。