簡體   English   中英

春季:無法使用環境將屬性從XML注入JavaConfig

[英]Spring: Unable to inject property using Environment from XML to JavaConfig

我正在支持使用基於XML的配置的舊版Spring Java項目。 從屬性源進行注入是這樣的:

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

我正在開發一個新功能,該功能將作為單獨的Spring項目實施,並作為對舊項目的依賴。 為了與時俱進,該新項目使用JavaConfig而不是基於XML的配置。 這樣,我的類將使用@Configuration注釋,其中包含一些@Bean方法,並會執行其他邏輯來設置項目中的類。 我通過在XML配置中將其聲明為Bean來注入並加載該Configuration:

<context:annotation-config/>
<beans:bean class="com.example.MyDefaultConfiguration"/>

此JavaConfig中依賴某些注入的屬性。 我從各種來源(例如此博客文章SOF答案)中讀到的內容是,可以通過將Environment實例注入到JavaConfig類中來完成此操作。 因此,我將其作為注入的全球領域:

@Inject
private Environment environment;

然后我可以根據需要在@Bean方法中執行此操作:

String prop = environment.getProperty("my.property");

但是,盡管在我的類路徑的app.properties文件中清楚列出了此屬性,但在環境中找不到該屬性,結果為null。 相反,如果要使用@Value注釋樣式注入屬性,如下所示,則可以將String變量正確注入:

@Value("${my.property}")
private String prop;

我很高興能夠解決該問題,但是對於為什么注入的Environment變量樣式對我不起作用,我仍然非常好奇。 這讓我擔心我在某處進行了某種形式的配置。 有人有想法么?

這個

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

基本上等於

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="locations" value="classpath:app.properties" />
</bean>

這只是一個帶有屬性的bean。 不涉及Spring Environment 也就是說,由屬性占位符配置程序定義和加載的屬性不會添加到Environment ,因此您無法通過Environment檢索它們。

通過Java批注配置,您可以通過使用@PropertySources注釋@Configuration類來為Environment添加屬性,該類指定了@PropertySource值的數組。

@PropertySources(value = { @PropertySource(value = "classpath:app.properties") })
@Configuration
public class Example {}

並取回它們

@Autowired
private Environment env;
...
env.getProperty("my.property");

這樣,您就無需為property-placeholder提供location

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM