弹簧:根据型材选择@Service

2022-09-01 23:04:19

我有一个接口定义如下:

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

我做错了什么?


答案 1

启用 Maven 配置文件后。但是,Maven型材独立于弹簧型材。只要您没有将 Maven 配置文件配置为设置适当的 Spring 属性,就必须通过以下方式启用 Spring 配置文件:-P

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更容易一些。


推荐