###疑問
Spring初学者です。現在「Spring解体新書」を使用して学習しています。
とあるクラスに、インターフェースを継承して使用した際に思った疑問をお聞きしたいです。
###疑問内容
インターフェースを継承したクラスの使用方法として、以下の形が普通であると認識しています。
interface intf { void run(); } class test implements intf { public void run(); } class Sample { public static void main(String args[]) { intf obj = new test(); obj.run(); } }
このように、継承されたクラスを呼び出し、オーバーライドしたメソッドを使用するというやりとりだと思うのですが
解体新書に載っていたのは、以下のようでした。
<!-- UserServiceインターフェース --> public interface UserService { // ユーザー登録 public void signup(MUser user); } <!-- UserServiceImplインターフェース --> @Service public class UserServiceImpl implements UserService{ @Autowired private UserMapper mapper; // ユーザー登録 @Override public void signup(MUser user) { user.setDepartmentId(1); //部署 user.setRole("ROLE_GENERAL"); //ロール mapper.insertOne(user); } } <!-- コントローラー --> @Autowired private UserService userService; @Autowired private ModelMapper modelMapper; @PostMapping("/signup") public String postSignup(Model model, Locale locale, @ModelAttribute @Validated(GroupOrder.class) SignupForm form, BindingResult bindingResult) { // 入力チェック結果 if (bindingResult.hasErrors()) { // NG:ユーザー登録画面に戻ります return getSignup(model, locale, form); } log.info(form.toString()); // formをMUserクラスに変換 MUser user = modelMapper.map(form, MUser.class); // ユーザー登録 userService.signup(user); ⬆︎疑問点ここです。 // ログイン画面にリダイレクト return "redirect:/login"; }
確かにインターフェース自体は実装してオーバーライドもしています。
しかし、DIで注入しているのは、インターフェース側のUserServiceで、
これを注入しても処理自体は継承した「UserServiceImpl」です。
本来ならば、実装したクラスをDIするのではないのでしょうか?
###考えていること
継承とDIは全く違う構造なので、それが作用しているのかなと考えています。
実際問題なく動作しているので、文句は全くないのですが、、、
非常に気になっています。
お手数ではありますが、ご教授いただければ幸いです。
どうぞよろしくお願い致します。
###補足
似たような件のサイトのURLを添付いたします。
回答1件
あなたの回答
tips
プレビュー