我有一个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<>();
}
我在自动装配期间不提供任何其他限定符......为什么会这样?
答案 0 :(得分:0)
假设您对spring-boot-starter-security
有依赖性,Spring Boot将自动配置自己的SecurityProperties
bean,该bean也使用@ConfigurationProperties
进行注释。不幸的是,这个bean将与你的bean具有相同的名称,因为类名(忽略包)是相同的。此名称冲突意味着Spring Boot将覆盖您的安全属性bean。您应该会在启动过程中看到记录该效果的警告消息。
正如您所观察到的,更改bean的名称以便不再存在名称冲突将解决问题。