Spring-Boot-Starter-Parent与基于XML的Spring配置中的“property-placeholder”相结合

时间:2016-12-18 09:28:40

标签: spring-boot property-placeholder

在我的POM中,我继承了Spring Boot的“spring-boot-starter-parent”:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.2.RELEASE</version>
</parent>

根据以下Spring Boot documentation Spring Boot Parent将maven-resources-plugin的默认过滤器令牌从$ {maven.token}更改为@ maven.token @,以防止与Spring样式占位符冲突。背景:Spring的分隔符与Maven分隔符完全相同。

根据我的理解:更改会影响Maven属性,而不会影响Spring属性扩展。但也许我错了,反之亦然?

现在,在我的基于XML的Spring应用程序上下文配置文件中使用“context:property-placeholder”时,通过以下方式导入:

@Configuration
@ImportResource("spring/applicationContext-core.xml")
@EnableJpaRepositories
@EnableAutoConfiguration
public class StudyDayApplication {

    /**
     * This main is for using Spring Boot in case of a JAR file packaging.
     * 
     * @param args
     */
    public static void main(String[] args) {
        SpringApplication.run(StudyDayApplication.class, args);
    }
}

Spring特定键的属性扩展不再起作用。在我的“application-core.xml”中,我使用特定于Spring的“property-placeholder”来使用外部化配置属性。但我仍然想使用特定于Spring的属性分隔符(例如,在我的“dataSource”bean中展开“jpa.driver.classname”)。

...
<context:property-placeholder
        ignore-resource-not-found="false"
        location="classpath*:*.properties"/>
...
<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
    <property name="driverClassName" value="${jpa.driver.classname}"/>
...

但Spring中的替换仅在用“@ jpa.driver.classname @”替换“$ {jpa.driver.classname}”时才有效

根据following remark添加以下XML属性:

order="1"
ignore-unresolvable="true"

到“property-placeholder”我在Spring Boot启动期间没有任何异常告诉我:

  

“无法在字符串值中解析占位符'jpa.driver.classname'   “$ {jpa.driver.classname}”

但我确信财产扩张不能正常运作,因为“财产占位符”忽略了无法解决的项目。稍后当使用非扩展属性键实例化bean时会导致异常。仅设置“order = 1”属性也无济于事。

也许,Spring Boot没有必要明确地将“property-placeholder”用作Spring Boot searches for "application.properties" automatically within the application。但我不想转向这种方法。

有没有办法使用“spring-boot-starter-parent”并保持典型的Spring属性扩展活动?

1 个答案:

答案 0 :(得分:0)

我发现了我的问题:-)这不是Spring会引起这种奇怪的效果,而是我的配置。

问题是:属性文件不在类路径的根文件夹中,而是位于下面。只要没有加载属性文件,就不能执行属性扩展。

要查找所有* .properties文件 - 即使在子目录中也必须使用ANT样式表示法:

<context:property-placeholder
        ignore-resource-not-found="false"
        location="classpath*:**/*.properties"/>

小心:使用此定义,所有“* .properties”文件都位于JAR文件和类路径根目录的任何子文件夹中。最后,它们合并为一个属性文件。所以,内存消耗可能会增加!

有关详细信息,请分别参考Spring documentation following comment @stackoverflow.com