2016-08-04 188 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