2016-08-04 236 views
1

我是一名春季新手,並試圖從簡單的'profile'處理Spring的優點中受益。我已經完成了本教程:https://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile,現在我想將這個概念適應一個簡單的例子。 我有兩個配置文件:devprod。我想象一個@Configuration類,每個配置文件可以實例化不同的bean(分別實現一個通用接口),具體取決於設置的配置文件。多彈簧配置文件(每個配置文件一個)

我目前使用的類是這樣的:

StatusController.java

@RestController 
@RequestMapping("/status") 
public class StatusController { 

    private final EnvironmentAwareBean environmentBean; 

    @Autowired 
    public StatusController(EnvironmentAwareBean environmentBean) { 
     this.environmentBean = environmentBean; 
    } 

    @RequestMapping(method = RequestMethod.GET) 
    Status getStatus() { 
     Status status = new Status(); 
     status.setExtra("environmentBean=" + environmentBean.getString()); 
     return status; 
    } 
} 

EnvironmentAwareBean.java

public interface EnvironmentAwareBean { 
    String getString(); 
} 

EnvironmentAwareBean.java

@Service 
public class DevBean implements EnvironmentAwareBean { 
    @Override 
    public String getString() { 
     return "development"; 
    } 
} 

EnvironmentAwareBean.java

@Service 
public class ProdBean implements EnvironmentAwareBean { 
    @Override 
    public String getString() { 
     return "production"; 
    } 
} 

DevConfig.java

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

    @Bean 
    public EnvironmentAwareBean getDevBean() { 
     return new DevBean(); 
    } 
} 

ProdConfig.java

@Configuration 
@Profile("prod") 
public class ProdConfig { 

    @Bean 
    public EnvironmentAwareBean getProdBean() { 
     return new ProdBean(); 
    } 

} 

運行示例拋出啓動過程中此異常(SPRING_PROFILES_DEFAULT設置爲dev):

(...)UnsatisfiedDependencyException:(...)嵌套的例外是org.springframework.beans.factory.NoUniqueBeanDefinitionException:沒有合格豆類型[EnvironmentAwareBean]被定義爲:期望的單個匹配bean,但找到3:prodBean,devBean,getDevBean

我的方法遠離推薦的配置嗎?在我看來,使用@Profile批註對每個Configuration進行註釋會更有意義,而不是對每個bean都進行註釋,並且稍後添加新類時可能會遺忘某些變體。

回答

2

EnvironmentAwareBean的實現全部注有@Service

這意味着它們都將被組件掃描,因此你會得到多個匹配的bean。他們是否需要註釋@Service

使用@Profile註釋標註每個@Configuration都沒問題。作爲教育練習的另一種方式是不使用@Profile,而是使用自己的@Conditional實現註釋@Bean或配置類。

+0

非常感謝。我只是刪除了@ @ Service'註釋,現在它按照我認爲應該的方式運行:) 我也會看看'@ Conditional'註釋。 – user3105453