私は以下のように定義するインターフェースを持っています:
public interface MyService {
}
そしてそれを実装する2つのクラス:
@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
何が悪いのですか?
-P
Mavenプロファイルを有効にします。ただし、MavenプロファイルはSpringプロファイルから独立しています。 Mavenプロファイルが適切なSpringプロパティを設定するように構成されていない限り、Springプロファイルを次のように有効にする必要があります。
mvn spring-boot:run -Dspring.profiles.active=dev
これを行うもう1つの方法は、プロダクションプロファイルを作成することです。
@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は少し簡単です。