多个Spring配置文件(每个配置文件一个)

时间:2016-08-04 19:30:24

标签: spring spring-mvc spring-boot spring-profiles

我是一名春天新秀,并试图从简单的配置文件中获益['处理春天。我已经完成了本教程: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:期望的单个匹配bean但找到3:prodBean,devBean ,getDevBean

我的方法远非推荐的配置吗?在我看来,使用Configuration注释来注释每个@Profile更有意义,而不是为每个bean添加它,并且可能在稍后添加新类时忘记一些变体。

1 个答案:

答案 0 :(得分:2)

EnvironmentAwareBean的实施都使用@Service注释。

这意味着它们将全部通过组件扫描获取,因此您将获得多个匹配的bean。是否需要使用@Service进行注释?

使用@Configuration注释对每个@Profile进行注释很好。作为教育练习的另一种方式是不使用@Profile,而是使用您自己的@Bean实现来注释@Conditional或Config类。