【问题标题】:Multiple Spring Configuration files (one per Profile)多个 Spring 配置文件(每个 Profile 一个)
【发布时间】:2016-12-11 01:57:06
【问题描述】:

我是一名 Spring 新手,并试图从 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: 预期单个匹配 bean 但找到 3: prodBean,devBean ,getDevBean

我的方法与推荐的配置相差甚远吗?在我看来,使用 @Profile 注释来注释每个 Configuration 会更有意义,而不是为每个 bean 都这样做,并且在以后添加新类时可能会忘记一些变体。

【问题讨论】:

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


    【解决方案1】:

    您对EnvironmentAwareBean 的实现都使用@Service 进行注释。

    这意味着它们都将被组件扫描拾取,因此您会得到多个匹配的 bean。需要用@Service注解吗?

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

    【讨论】:

    • 非常感谢。我刚刚删除了@Service 注释,现在它可以正常工作了:)我也会研究@Conditional 注释。
    猜你喜欢
    • 2015-01-16
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    相关资源
    最近更新 更多