こんばんは、中尾です。
@Primary
を使う場面を解説します。
例えば以下のインターフェースがあるとします
public interface TestService { String test(); }
対して実装は2つあります。
@Service public class TestServiceImpl implements TestService { @Override public String test() { return "TestServiceImpl"; } }
@Service public class TestService2Impl implements TestService { @Override public String test() { return "TestService2Impl"; } }
コントローラーで TestService
を DIするとどうなるでしょう?
@Controller @RequiredArgsConstructor @Slf4j public class IndexController { private final TestService testService; @GetMapping("/") public String index() { log.info(testService.test()); return "index"; } }
Parameter 0 of constructor in IndexController required a single bean, but 2 were found: IndexController のコンストラクターのパラメーター 0 には 1 つの Bean が必要でしたが、2 つ見つかりました。
っと怒られます。要するに実体はどっちなのかわからないよ。一つにしてくれ。っと言われています。
しかし、2つ使いたいときがあります。
そういうときに、@Primary
を使います。
@Primary @Service public class TestService2Impl implements TestService { @Override public String test() { return "TestService2Impl"; } }
上記の場合であれば、TestService2Implが優先的に表示されます。