Spring:在java配置中注入外部属性

时间:2016-01-28 15:38:53

标签: java spring spring-boot

我有一个Spring启动应用程序(1.3.1.RELEASE),并且最近在尝试将@ConfigurationProperties bean注入我的配置时遇到了一种奇怪的行为。我不是Spring的专家,所以我的问题是如何解释这种行为?

所以设置就是这样:

MyApplication.java

package me.developer;

@SpringBootApplication
public class MyApplication {

    public static void main(final String... args) {
        SpringApplication.run(<..>, args);
    }

}

SecurityProperties.java

package me.developer.document.security;

@Setter
@Getter
@Component
@ConfigurationProperties(prefix = "security")
public class SecurityProperties {   
    private List<String> apiKeys = new ArrayList<>();
}

SecurityConfiguration.java

package me.developer.document;

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private SecurityProperties securityProperties;

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        <..>
    }

}

当应用程序启动时,我收到一个错误,Spring无法注入 SecurityConfiguration.securityProperties ,因为它对 me.developer.document.security.SecurityProperties 豆。

但是如果我将SecurityProperties重命名为SicurityProperties(第二个字母&#34; e&#34; - &gt;&#34;我&#34;) - 有用!不要问我是怎么做到的,但我只是好奇如何解释这种行为?即从我的角度来看它应该工作与否,但不取决于bean名称等......

更新: 如果我不接触类名,但我明确指定了bean名称

,我也会工作
package me.developer.document.security;

@Setter
@Getter
@Component("securityProperties.my")
@ConfigurationProperties(prefix = "security")
public class SecurityProperties {   
    private List<String> apiKeys = new ArrayList<>();
}

我在自动装配期间不提供任何其他限定符......为什么会这样?

1 个答案:

答案 0 :(得分:0)

假设您对spring-boot-starter-security有依赖性,Spring Boot将自动配置自己的SecurityProperties bean,该bean也使用@ConfigurationProperties进行注释。不幸的是,这个bean将与你的bean具有相同的名称,因为类名(忽略包)是相同的。此名称冲突意味着Spring Boot将覆盖您的安全属性bean。您应该会在启动过程中看到记录该效果的警告消息。

正如您所观察到的,更改bean的名称以便不再存在名称冲突将解决问题。