2017-08-05 26 views
0

我開發它具有以下封裝結構的彈簧啓動web應用..如何排除一些@Configuration只有在春天開機使用@Import導入

- com.myname.configs 
    - CommonConfiguration.java 
    - DevConfiguration.java 
    - ProdConfiguration.java 
    - SomeOtherConfiguration.java 
- com.myname.profiles 
    - DevProfile.java 
    - ProdProfile.java 

所有這些類是@Configuration類,但DevProfile.java和ProdProfile.java也具有@Profile和@Import註釋。

CommonConfiguration ..

@Configuration 
public class CommonConfiguration { 
    //commmon configs/beans.. 
} 

DevConfiguration ..

@Configuration 
@Profile("dev") 
public class DevConfiguration { 

    @Bean 
    //dev specific beans.. 
} 

DevProfile ..

@Configuration 
@Import(value = {CommonConfiguration.class, DevConfiguration.class}) 
@Profile("dev") 
public class DevProfile {} 

ProdProfile ..

@Configuration 
@Import(value = {CommonConfiguration.class, ProdConfiguration.java}) 
@Profile("prod") 
public class ProdProfile {} 

由於某些原因,即使使用-Dspring.profile.active = prod,也會創建DevConfiguration的bean。唯一的解決方法是向DevConfiguration.java添加@Profile(「dev」)註釋

有沒有辦法在@Import批註中爲類創建bean?在一個Profile類中管理Imports比在各個Configuration類中添加Profile要合理。

我正在尋找一個方式做什麼@Aaron Digulla建議在這裏爲#1 How to exclude some @Configuration file in Spring?

+0

我認爲如果@Configuration類在組件掃描路徑中,它們將被創建,除非您告訴容器將其排除。你如何註釋DevConfiguration? – efekctive

+0

更重要的是:@Configuration類在錯誤的配置文件中? – efekctive

+1

你正在掃描哪些軟件包? –

回答

2

如果使用配置類(CommonConfigurationDevConfiguration等)只能通過導入輪廓類(DevProfile等),然後你纔可能從配置類刪除@Configuration
在這種情況下,只能通過活動profile-class創建來自config-classes的bean(現在config for classes和profile-classes都在spring中爲bean進行掃描,但@Profile("...")僅影響配置文件類)。

+0

這是最優雅和最簡單的答案。你絕對正確!哈哈..我爲什麼沒有想到.. – Gagan

+0

我正要爲此發佈代碼,但不需要它。 – efekctive

0

其實,在發佈評論後不久,我找到了答案。這是Kirby's在這裏的答案Exclude subpackages from Spring autowiring?

在我的情況下,我已經在@SpringBootApplication註釋後面添加了這個。

@SpringBootApplication 
@ComponentScan(basePackages = { "com.myname" }, 
       excludeFilters = @ComponentScan.Filter(type = FilterType.ASPECTJ, pattern = "com.myname.configs.*")) 
public class DemoWebappApplication {...} 

這樣,配置文件類將與其中的@Imports一起連線。