无法使Spring@Value属性注入工作

无法使Spring@Value属性注入工作,spring,groovy,properties,dependency-injection,Spring,Groovy,Properties,Dependency Injection,我有一个用@SprintBootApplication注释的配置类,还有一个application.properties文件,位于类路径的根(resources/application.properties)中,其值为 jmx.rmi.host="localhost" 然后,我定义了一个单独的组件,用于尝试像这样的@Value注入 @Component class Props { private Map props = [:] boolean jmxEnabled S

我有一个用
@SprintBootApplication
注释的配置类,还有一个
application.properties文件
,位于类路径的根(
resources/application.properties
)中,其值为

jmx.rmi.host="localhost"
然后,我定义了一个单独的组件,用于尝试像这样的
@Value
注入

@Component
class Props {

    private Map props = [:]
    boolean jmxEnabled
    String host

    @Autowired  //test inject the env
    Props (Environment env) {
        jmxEnabled = env.getRequiredProperty("org.softwood.jmx", Boolean.class)
        props[jmxEnabled]=jmxEnabled


    }

    void setHost (@Value ('${jmx.rmi.host}') String host)  {

        assert host
        println "set host by injection"
        this.host = host
        props[host] = host
    }

}
当我在“-Gstring”中尝试
@Value
失败时,我的第一个问题就解决了。所以转换回“”-字符串和它的快乐

在我的示例应用程序脚本中,我获得了spring上下文和rulesEngine bean,然后尝试获得我的示例道具bean

使用autowiredenv的构造函数注入似乎可以工作。但是使用
@Value
向主机注入的方法不会得到任何结果。当我尝试断言时,Host为null,而不是我所期望的“localhost”

我错过了一些简单的事情,但我看不到,有人能指出我做错了什么吗

PS:我在核心配置类上尝试了这个
@PropertySource(“classpath:application.properties”)

并尝试将其定义为bean

@Bean
static PropertySourcesPlaceholderConfigurer propertyPlaceHolderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer()
}
同样,但没有效果,我仍然使用
@Value


如果您有任何帮助,我们将不胜感激

将注释放在setter方法上,而不是参数上:

@Value('${jmx.rmi.host}') 
void setHost (String host)  {

    assert host
    println "set host by injection"
    this.host = host
    props[host] = host
}

将注释放在setter方法而不是参数上:

@Value('${jmx.rmi.host}') 
void setHost (String host)  {

    assert host
    println "set host by injection"
    this.host = host
    props[host] = host
}

我尝试了您所说的,但仍然得到一个null,该方法现在看起来像@Value('${jmx.rmi.host}')void setHost(String host){…注入的env在构造函数上仍然可以正常工作。您是否需要另一个注释才能从application.properties中获得@Value注入来工作?实际上,它似乎既没有,也没有。我只是断言失败,assert p.host==“localhost”,但它将注入的主机值显示为“localhost”。因此注入工作正常,但localhost不等于localhost!让我看看我的application.properties在localhost jmx.rmi.host=“localhost”周围加了引号有什么问题,因此注入的值包括“”同样。如果我从prop文件中删除引号,它会得到正确的答案。那么我的最后一个问题是:@value为什么对方法有效?但对参数无效?我可以发誓,我在其他示例中看到过参数注入样式的示例吗?我尝试了你所说的,但仍然得到null,该方法现在看起来像@value('s)${jmx.rmi.host}')void setHost(String host){…注入的环境在构造函数上仍然可以正常工作。您是否需要另一个注释来从application.properties获取@Value injection以使其工作?实际上,它似乎既不是,也不是。我只是断言失败,断言p.host==“localhost”,但它将注入的主机值显示为“localhost”。因此注入工作正常,但localhost不等于localhost!让我看看My application.properties在localhost jmx.rmi.host=“localhost”周围加了引号有什么问题,因此注入的值包括”"同样。如果我从prop文件中删除引号,它会得到正确的答案。那么我的最后一个问题是:@value为什么对方法有效?但对参数无效?我可以发誓我在其他示例中看到过参数注入样式的示例吗?将其放在setter上不会有任何作用,只需将其添加到字段或构造函数中即可。将它在setter上不起任何作用,只需将它添加到字段或构造函数中即可。