gpt4 book ai didi

java - Spring:无法使用环境从 XML 向 JavaConfig 注入(inject)属性

转载 作者:行者123 更新时间:2023-12-02 04:50:24 25 4
gpt4 key购买 nike

我正在致力于支持使用基于 XML 的配置的旧 Spring Java 项目。从属性源注入(inject)的方式如下:

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

我正在开发一项新功能,该功能作为单独的 Spring 项目实现,作为遗留项目的依赖项。为了与时俱进,该新项目使用 JavaConfig 而不是基于 XML 的配置。因此,我的类用 @Configuration 进行注释,其中包含一些 @Bean 方法,并执行其他逻辑来设置我的项目中的类。我通过在 XML 配置中将配置声明为 bean 来注入(inject)并加载配置:

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

此 JavaConfig 依赖于某些注入(inject)的属性。我从各种来源读到的内容,例如 this blog postthis SOF answer ,这可以通过将 Environment 实例注入(inject)我的 JavaConfig 类来完成。因此我将其作为注入(inject)的全局字段:

@Inject
private Environment environment;

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

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

但是,尽管在我的类路径的 app.properties 文件中清楚地列出了该属性,但在环境中找不到该属性并导致值为 null。相反,如果我使用 @Value 注释样式注入(inject)属性,如下所示,那么我确实可以将 String 变量正确注入(inject)到:

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

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

最佳答案

这个

<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。也就是说,由属性占位符配置程序定义和加载的属性不会添加到环境中,因此您无法通过它检索它们。

通过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 提供位置

关于java - Spring:无法使用环境从 XML 向 JavaConfig 注入(inject)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29292945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com