Spring Util:通过注释将属性注入到豆子中

如果我在我的Spring XML中设置了2个.properties文件,如下所示:

<util:properties id="serverProperties" location="file:./applications/MyApplication/server.properties"/>
<util:properties id="someConfig" location="file:./applications/MyApplication/config.properties"/>

如何通过注释将这些属性文件注入到带有?java.util.Properties

如何通过 Spring 注释获取特定属性?

干杯!


答案 1
@Autowired
@Qualifier("serverProperties")
private Properties serverProperties;
@Autowired
@Qualifier("someConfig")
private Properties otherProperties;

@Resource(name = "serverProperties")
private Properties serverProperties;
@Resource(name = "someConfig")
private Properties otherProperties;

通常,@Autowired用于春季的按类型自动布线,@Resource用于按名称。@Autowired+@Qualifier可以兼作按名称自动布线,但它实际上适用于能够微调类型的按类型自动布线。


答案 2

因为这个问题有很多命中率。我认为使用SpEL(弹簧表达式语言)指出另一个选项是值得的 - 如果您需要特定属性,可以使用特定bean属性上的@Value注释注入它们;

class SomeClass {
   @Value("#{serverProperties['com.svr.prop']}")
   private String aServerCfgProperty;

   @Value("#{someConfig['another.config.setting']}")
   private String someOtherProperty;
}

你不需要使用索引语法,你可以直接得到它;['index.val']

@Value("#{someConfig}")
private Properties someConfig

@Value("#{serverProperties}")
private Properties svrProps;

我发现这非常有用,并不再使用通过@Resource / @Autowired直接注入的属性对象。

将 与索引属性对象一起使用的另一个很好的原因是,一些IDE(例如IntelliJ)可以重构实际的属性名称,如果你在项目中也有.properties文件,这很好。另一个技巧是使用类似EProperties的东西(它扩展了本机Java Properties对象),如果你想在属性文件中进行包含/嵌套/替换而不使用Spring的类(可悲的是,它没有公开其属性 - 要使用SpEL索引,Bean需要成为Java Properties对象的扩展映射的实例)...@ValuePropertiesPlaceholderConfigurer['key']Map<>

最后,SpEL的另一个简洁功能是您可以直接访问bean的属性。例如,如果在上面的例子中是一个春天的豆子,例如 然后在AnotherBeanClass中,我们可以拥有;SomeClasssomeClass

@Value("#{someClass.someOtherProperty}")
private String injectedBeanProp

您还可以调用 getter 方法:

@Value("#{someClass.getSomeOtherProperty()}")
private String injectedBeanProp

请在此处查看 SpEL 指南;http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#expressions