はじめに
Spring Bootで@Autowiredでinjectionしますが、環境毎に読み込む対象を変えたいというケースがあった場合の対応について書きます。
ここでいう環境とはSpring Boogの起動引数spring.profiles.activeのことで、この起動引数を変えた場合に読み込むクラスを変えるという話です。
環境
Java10
Spring Boot2.0.4.RELEASE
ちょっと前に作ったものなので、環境が古いですがJava11とBoot2.1系でもこれで動くはずです。
interfaceを用意する
まずはinterface(abstract classでも可)を用意します。
public interface TestInterface {
void print();
}
interfaceの実体を用意する
環境毎に読み込む対象を変えたいということで先ほどのinterfaceをimplementsしたクラスを2つ生成します。
この2つのクラスを起動引数によって変更します。
引数にはtestとtest2`を与えるとします。
@Service
@Profile("test")
public class TestServiceA implements TestInterface {
public void print() {
System.out.println("test");
}
}
@Service
@Profile("test2")
public class TestServiceB implements TestInterface {
public void move() {
System.out.println("test2");
}
}
@Profileを付けるだけです。
これを付けておくと起動引数が合わない場合はBean化対象とされません。
使う側の実装
今回はControllerからこのクラスを使用します。
@Controller
public class TestController {
@Autowired
private TestInterface testInterface;
// Controllerの処理
}
対象のクラスをinterfaceにするだけです。
ProfileにてBeanとなっている対象が1つのみとなっているため、起動引数によって対象が変わります。