`@Primary`を使う場面

こんばんは、中尾です。

@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が優先的に表示されます。