Spring:无法使用来自 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 的配置。因此,我的 class 带有 @Configuration 注释,其中有一些 @Bean 方法,并执行其他逻辑以在我的项目中设置 classes。我通过在 XML config:

中将其声明为 bean 来注入并加载配置
<context:annotation-config/>
<beans:bean class="com.example.MyDefaultConfiguration"/>

此 JavaConfig 依赖于一些注入的属性。我从各种来源(例如 this blog post and this SOF answer)了解到,这可以通过将 Environment 实例注入我的 JavaConfig class 来完成。因此我将其作为注入的全局字段:

@Inject
private Environment environment;

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

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

但是,在环境中找不到此 属性 并导致值为 null,尽管它已明确列在我的 classpath 的 app.properties 文件中。相反,如果我要使用 @Value 注释样式注入 属性,如下所示,那么我确实会正确地将 String 变量注入到:

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

很高兴我能够解决这个问题,但我仍然非常好奇为什么注入的环境变量样式对我不起作用。这让我担心我在某处搞砸了某种配置。有人有什么想法吗?

这个

<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 中,因此您无法通过它检索它们。

通过 Java 注释配置,您可以通过使用 @PropertySources 注释您的 @Configuration class 来向 Environment 添加属性,该 @PropertySources 指定数组 @PropertySource 值。

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

并检索它们

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

这样您就不需要向 property-placeholder 提供 location