2016-01-28 53 views
0

我有一個彈簧啓動應用程序(1.3.1.RELEASE),並且最近在嘗試將@ConfigurationProperties bean注入到我的配置中時遇到了一個奇怪的行爲。我不是Spring的專家,所以我的問題是如何解釋這種行爲?Spring:向java注入外部屬性配置

所以設置是這樣的:

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 { 
     <..> 
    } 

} 

當應用程序被啓動,我得到一個錯誤,因爲它一無所知me.developer.document.security.SecurityProperties豆春季不能注入SecurityConfiguration.securityProperties

,如果我重新命名SecurityPropertiesSicurityProperties(第二個字母 「E」 - > 「我」) - 它的作品!不要問我怎麼做到這一點,但我只是好奇這種行爲如何解釋?即從我的角度來看,它應該工作或沒有,但不依賴於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

bean的名稱必須與類名相匹配,除了第一個字母用小寫字母命名。例如bean'securityProperties'匹配類SecurityProperties。你可能有一些錯誤導致了這種行爲 – OPK

+0

沒有( )問題是當類名稱與bean名稱不匹配時,即'private SicurityProperties securityProperties'。 –

+0

你有一個xml文件或屬性文件 – OPK

回答

0

假設您對spring-boot-starter-security有依賴性,Spring Boot將自動配置其自己的SecurityProperties bean,該bean也被註釋爲@ConfigurationProperties。不幸的是,這個bean與你的bean具有相同的名稱,因爲類名(忽略包)是相同的。這個名字衝突意味着Spring Boot已經被重寫了你的安全屬性bean。您應該看到一條警告消息,記錄啓動過程中記錄的效果。

正如您所看到的,更改您的bean的名稱以避免名稱衝突將解決該問題。

+0

是的,我終於來到了相同的決定......但是從我的角度來看,春天可能更加冗長 - 你無法通過內心學習所有的內置豆來避免這種情況。另一方面,明確給你的bean定義一個不能與Spring相沖突的獨特名稱可能是一個好主意。以防萬一。 –

相關問題