当前位置: 首页 > 知识库问答 >
问题:

如何在Spring中初始化property-placeholder(带有附加到当前应用程序上下文的环境)?

陆城
2023-03-14

我使用的是Spring Framework 3.2.6.Release。

我正在尝试使用命令行界面(使用JOptCommandLinePropertySource)通过

PropertySource<?> propertySource = new JOptCommandLinePropertySource(options);
final GenericApplicationContext context = new GenericApplicationContext();
context.getEnvironment().getPropertySources().addFirst(propertSource);
...

我有这个beans配置器:

package com.example;

@Configuration
public class AppConfig {
  @Value("${prop1}")
  private String prop1;

  @Bean
  public MyBean myBean() {
    MyBean ret = new MyBean();
    ret.init(prop1);
    return ret;
  }
}

我用命令行参数开始我的程序:--prop1=prop_value

<beans>
  <context:annotation-config />
  <context:property-placeholder />
  <context:component-scan base-package="com.example" />
</beans>
13:47:36.932 [main] DEBUG o.s.b.f.annotation.InjectionMetadata - Processing injected method of bean 'AppConfig': AutowiredFieldElement for private java.lang.String com.example.AppConfig.prop1
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AppConfig': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String com.example.AppConfig.prop1; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'prop1' in string value "${prop1}"
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) ~[spring-beans-3.2.6.RELEASE.jar:3.2.6.RELEASE]
...
<beans>
  <context:annotation-config />
  <context:component-scan base-package="com.example" />

  <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="environment" ref="environment" />
  </bean>
</beans>

解析${...}的PlaceholderConfigurerSupport专门化当前Spring环境及其PropertySources集的bean定义、属性值和@Value注释中的占位符。

共有1个答案

戚成礼
2023-03-14

当使用命名空间配置时,建议使用无版本的XSD。因此,建议使用http://www.springframework.org/schema/context/spring-context-2.5.xsd代替http://www.springframework.org/schema/context/spring-context.xsd。这确保spring将使用类路径上可用的xsd的最新版本。

关于 在Spring3.1中关于默认配置的一些更改(breaking(?))。在Spring3.1之前,system-properties-mode属性的默认值是FALLBACK,这在Spring3.1中导致创建PropertyPlaceHolderConfigureer而不是PropertySourcesPlaceHolderConfigureer。默认值在特定的XSD中配置。(好像Spring 3.1是环境)。

因此,使用较旧的xsd会导致属于特定xsd版本的默认行为,可以切换到3.2 xsd或无版本的xsd。(如前所述,建议使用后者)。

 类似资料:
  • 问题内容: 对于常规的Servlet,我想你可以声明一个上下文侦听器,但是对于Spring MVC,Spring可以使它更容易吗? 此外,如果定义了上下文侦听器,然后需要访问在或中定义的bean,我将如何访问它们? 问题答案: 为此,你必须创建并注册一个实现该接口的bean,如下所示: 然后,你在或文件中注册此bean : 当应用程序上下文初始化时,Spring会通知它。 在Spring 3中(如

  • 背景:我构建了一个Jersey应用程序(即一个WAR),并在服务器集群上部署它,在不同的服务器上配置不同的Spring配置,以启用或禁用服务器的不同部分,例如,某些服务器启用了资源,等等。这在Jersey 1.0中非常容易:我只是说, 在Spring配置中,让Jersey扫描特定包并启用其中的JAX-RS资源提供者。 现在在Jersey 2.0中,Spring不起作用,因此必须以编程方式在从派生的

  • 在使用PostgreSQL数据库启动sprint boot应用程序时出现错误,我试图找到一个解决方案,但到目前为止还没有找到。 这里有个错误: 2018-03-29 17:48:17.945警告13508--[main]ationConfigEmbeddedWebApplicationContext:上下文初始化过程中遇到异常-取消刷新尝试:org.springFramework.Beans.Fa

  • 我有以下情况。在我的微服务[MA]中,我希望在应用程序启动后或基于某个事件初始化/销毁一些bean。想象一下,还有另一个微服务[MB],它保存关于ContentStores的信息。在MA启动之后,我想向MB请求contentStore条目,基于此,我想根据需要创建这么多bean。可能会有一个事件触发storrecreated/storredeleted,在这种情况下,我需要销毁bean。 我目前不

  • 我想不出如何使爆米花工作,如下所示:https://getbootstrap.com/docs/4.0/components/popovers/. 文档中提到了popover支持是一个插件,并且需要工具提示插件,所以我修改了我的要添加这两个,现在看起来如下所示: 我还没有找到任何关于引导插件概念的文档,所以上面关于和的两行来自搜索,不确定它们是否正确。 留档声明: Popovers是基于性能原因选