【问题标题】:Injecting Properties using Spring & annotation @Value使用 Spring 和注解 @Value 注入属性
【发布时间】:2011-09-19 12:39:22
【问题描述】:

我正在尝试将属性文件加载到 Spring bean 中,然后将该 bean 注入到一个类中。

我唯一无法开始工作的部分似乎是使用 @Resource 参考。有人可以帮我连接最后一个部分吗?我每次都得到一个空值。似乎不想注入价值。

[编辑] - 我最初认为使用 @Resource 是最好的方法,但我发现建议的解决方案更容易。

我在另一篇文章中看到了这个解决方案:

参考解决方案链接: Inject Property Value into Spring - posted by DON

感谢 Don 的帖子,但我只是不确定如何使用 @Resource 来完成它。

调试结果: 变量值appProperties 始终为空。它没有被注入。

弹簧配置。

示例类:

package test;

import java.util.Properties;
import javax.annotation.Resource;


public class foo {
    public foo() {}
    @Resource private java.util.Properties appProperties;
}

基于以下已批准解决方案中的建议。这是我所做的更改。


解决方案更新:

弹簧配置:

Java 类:

【问题讨论】:

  • 尝试解决方案时会发生什么?
  • private @Resource 属性是错字吗?你试过@Resource 私有属性吗?我不确定它不应该像这样工作我只是在修饰符之前从未见过注释。
  • @Skaffman - 我得到一个空值。变量值没有被绑定和注入。
  • @abalogh 是的,我切换了@Resource,但仍然没有变化。
  • 你确定你的 foo bean 是 Spring 管理的吗?它是在 appcontext 中明确定义还是您正在使用组件扫描?

标签: java spring dependency-injection


【解决方案1】:

为了使您的解决方案正常工作,您还需要使 foo 成为 Spring 托管 bean;因为否则 Spring 怎么知道它必须处理你的类上的任何注释?

  • 您可以在 appcontext xml 中将其指定为带有 ..class="foo" 的 bean
  • 或者使用component-scan 并指定一个包含foo 类的基础包。

因为我不完全确定这正是您想要的(您不希望 Spring 解析 .properties file 并使用它的键值对而不是 @ 987654325@ 对象?),我建议您另一种解决方案:使用util 命名空间

<util:properties id="props" location="classpath:com/foo/bar/props.properties"/>

并引用 bean 中的值(也必须由 Spring 管理):

@Value("#{props.foo}")
public void setFoo(String foo) {
    this.foo = foo;
}

编辑:

刚刚意识到您正在课堂上导入org.springframework.context.ApplicationContext,这可能是不必要的。我强烈建议您至少阅读前几章 Spring reference,因为 a) 这是一本很棒的书 b) 如果基础清晰,您会发现理解 Spring 会容易得多。

【讨论】:

  • 感谢 abalough 我将尝试使用
  • 如果我选择不使用@Component 和组件扫描的第一种实现方法,我将不再正确使用@Value,因为我必须在spring 配置中注入?
  • 另请注意,您在@Value 中给出的值,在上面的示例中为“#{props.foo}”,不应包含属性 KEY 本身的点(在此示例中为“foo”)。我正在从旧的学校方式迁移到使用 EL,我在属性文件中的密钥的形式为 a.b.c=xyz 等。但它失败了。然而,假设 abc=xyz 有效。
  • 如果您确实需要这些点,请改用 id[key] 表示法。示例:app.billing.orderform=myorderform 然后使用 appProps 设置属性 id。所以@Value 变成了@Value("#{appProps['app.billing.orderform']}") 我知道,是不是很丑。
【解决方案2】:

使用属性占位符的另一种解决方案。

春天的背景:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <context:component-scan base-package="your.packege" />

    <context:property-placeholder location="classpath*:*.properties"/>

</beans>

你想要注入属性值的java类:

public class ClassWithInjectedProperty {

    @Value("${props.foo}")
    private String foo;
}

【讨论】:

    猜你喜欢
    • 2013-01-15
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 2022-06-22
    相关资源
    最近更新 更多