【问题标题】:Spring: Selecting @Service based on profileSpring:根据配置文件选择@Service
【发布时间】:2017-06-13 00:03:41
【问题描述】:

我有一个接口定义如下:

public interface MyService {
}

还有两个实现它的类:

@Service
@Profile("dev")
public class DevImplementation implements MyService {
}

@Service
@Profile("prod")
public class ProdImplementation implements MyService {
}

还有另一个服务试图使用它:

@Service
public MyClass {
    @Autowired
    MyService myservice;
}

问题是我在运行代码时收到NoSuchBeanException。它使用

运行

mvn spring-boot:run -P dev

我做错了什么?

【问题讨论】:

    标签: java spring autowired spring-profiles


    【解决方案1】:

    使用-P 可以启用 Maven 配置文件。但是 Maven 配置文件独立于 Spring 配置文件。只要您没有配置 Maven 配置文件来设置适当的 Spring 属性,您就必须以这种方式启用 Spring 配置文件:

    mvn spring-boot:run -Dspring.profiles.active=dev
    

    【讨论】:

      【解决方案2】:

      另一种方法是拥有一个生产配置文件,并且开发是隐含在它没有被设置的,例如

      @Component
      @Profile("prod")
      public class ProdImplementation implements MyService {
      }
      

      ...并且开发人员实现的配置文件为“!prod”。

      @Component
      @Profile("!prod")
      public class DevImplementation implements MyService {
      }
      

      所以要在生产模式下运行,您必须输入配置文件...

      > mvn spring-boot:run -Dspring.profiles.active=prod
      

      ...开发模式不需要配置文件...

      > mvn spring-boot:run
      

      IMO 更容易一些。

      【讨论】:

        猜你喜欢
        • 2020-09-04
        • 1970-01-01
        • 1970-01-01
        • 2017-10-06
        • 2012-09-23
        • 1970-01-01
        • 2016-12-27
        相关资源
        最近更新 更多