代码之家  ›  专栏  ›  技术社区  ›  user3105453

多个弹簧配置文件(每个配置文件一个)

  •  1
  • user3105453  · 技术社区  · 10 年前

    我是一名Spring新手,试图从Spring的简单“配置文件”处理优势中获益。我已经完成了本教程: https://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile 现在我想把这个概念改成一个简单的例子。 我有两个配置文件: dev 和 prod .我想 @Configuration 类,其中我可以根据设置的配置文件实例化不同的bean(分别实现一个公共接口)。

    我当前使用的类如下所示:

    状态控制器.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;
        }
    }
    

    环境感知Bean.java

    public interface EnvironmentAwareBean {
        String getString();
    }
    

    环境感知Bean.java

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

    环境感知Bean.java

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

    开发配置.java

    @Configuration
    @Profile("dev")
    public class DevConfig {
    
        @Bean
        public EnvironmentAwareBean getDevBean() {
            return new DevBean();
        }
    }
    

    产品配置.java

    @Configuration
    @Profile("prod")
    public class ProdConfig {
    
        @Bean
        public EnvironmentAwareBean getProdBean() {
            return new ProdBean();
        }
    
    }
    

    运行该示例会在启动期间引发此异常( SPRING_PROFILES_DEFAULT 设置为 开发 ):

    (…)UnsatisfiedDependencyException:(…)嵌套异常为org.springframework.beans.factory。NoUniqueBeanDefinitionException:未定义类型为[EnvironmentAwareBean]的限定bean:应为单个匹配bean,但找到3:prodBean、devBean、getDevBean

    Configuration 使用 @Profile 注释,而不是对每个bean进行注释,并且在稍后添加新类时可能会忘记一些变体。

    1 回复  |  直到 10 年前
        1
  •  2
  •   UserF40    10 年前

    EnvironmentAwareBean 都有注释 @Service .

    @服务 ?

    注释每个 @Configuration 使用 @Profile 注释很好。另一种教育方式是不使用 @个人资料 而是注释 @Bean 或使用自己的实现配置类 @Conditional .