質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

1128閲覧

Java インターフェースを継承したクラスの呼び出しについて

1998Ttf

総合スコア6

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/09/27 08:32

編集2021/09/27 09:37

###疑問

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を添付いたします。

https://www.msawady.com/entry/2019/05/12/170527

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mather

2021/09/27 08:44

1つ目のサンプルコードに関する理解を確認したいのですが、 test obj = new test(); このコードだとそもそもインターフェースを使っていませんよね。 これはインターフェースの存在意義がわからないという意図でしょうか?
mather

2021/09/27 08:50

> 確かにインターフェース自体は継承してオーバーライドもしています。 > しかし、DIで注入しているのは、インターフェース側のUserServiceで、これを注入しても処理自体は継承した「UserServiceImpl」です。 > 本来ならば、継承した方をDIするのではないのでしょうか? 「継承」というより「インターフェースの実装」ですが、 `UserService` インターフェースのインスタンスを要求している箇所に `UserServiceImpl` を注入していることになりますよね。 あなたの言葉で言う「継承した方」をDIしていると思います。 言葉の定義がごちゃついているように感じられますので、どんな意味で「継承」を使っていて、「継承した方」とはなにを指すのか質問に追記してください。
1998Ttf

2021/09/27 09:04

ご返信ありがとうございます! 私の記載方法が分かりづらいとのご指摘、ありがとうございます。 「一つ目のサンプルコードに関する理解」についてなのですが、別サイトから引用したコードを下記に記載します。 こちらと、私が一つ目に書いたコード、どう言った点で、インターフェースを使っていないのかご指摘いただければ幸いです。 ``` // インターフェース interface MyInterface { void myMethod1(); void myMethod2(); } // インターフェースを実装したクラス class MyClass implements MyInterface { public void myMethod1() { System.out.println(""implementation of myMethod1""); } public void myMethod2() { System.out.println(""implementation of myMethod2""); } } // インターフェースを実装したクラスを実行 public class Main { public static void main(String[] args) { MyClass myClass = new MyClass(); myClass.myMethod1(); myClass.myMethod2(); } } ```
1998Ttf

2021/09/27 09:06

また 継承 => x 実装 => ◯ こちらもご指摘いただき、ありがとうございます。
mather

2021/09/27 09:24

インターフェースを使っていないとは、interfaceの定義を削除した以下のコードでも動作することを意味しています。 class MyClass { public void myMethod1() { System.out.println(""implementation of myMethod1""); } public void myMethod2() { System.out.println(""implementation of myMethod2""); } } // インターフェースを実装したクラスを実行 public class Main { public static void main(String[] args) { MyClass myClass = new MyClass(); myClass.myMethod1(); myClass.myMethod2(); } } インターフェースを利用したコードだと MyInterface myValue = new MyClass(); のようになるはずです。
1998Ttf

2021/09/27 09:34

ありがとうございます! 失礼致しました。簡易的に書きすぎてしまっていました。 ご指摘いただいた、「インターフェースを利用したコード」については、理解しております。 DIについてですが、 @Autowired private UserService userService; こちらの記述で、「UserServiceImpl」を注入できていることになるのでしょうか。 下記に、似たような記述があるサイトのURLを記載させていただきます。 こちらご査収いただけますでしょうか。認識が合っていれば、幸いです、 大変お手数お掛けいたします。 また、ご指摘いただいた分に関しては、修正させていただきます、ありがとうございます。
mather

2021/09/27 10:00

そのURLにある例は同じインターフェースに複数の実装クラスがある場合の応用例だと思います。さらに複雑です。 質問を見る限り、SpringやDIの理解を急ぐよりも前に、まずJavaの基礎から体系的にしっかり学んだほうが良いかもしれません。
guest

回答1

0

ベストアンサー

しかし、DIで注入しているのは、インターフェース側のUserServiceで、
これを注入しても処理自体は継承した「UserServiceImpl」です。

ここに勘違いがあるように思います。

java

1 @Autowired 2 private UserService userService;

ここで宣言している userService 変数は「 UserService インターフェースを実装したインスタンスが入る」という意味です。 UserService そのものを注入しているわけではありません。(そもそもメソッドの実装がないのでそのままではインスタンスにはならない)
実際にDIで注入されるのは 「UserService インターフェースを実装した」 UserServiceImpl クラスのインスタンスです。

java

1private UserService userService = new UserServiceImpl(); // 実際の処理ではありません

例えば、 List<String> インターフェースの変数に ArrayList<String> のインスタンスを入れるなどJavaの学習時に典型的な例として見ているのではないでしょうか?

java

1List<String> hoge = new ArrayList<String>();

投稿2021/09/27 09:53

mather

総合スコア6759

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1998Ttf

2021/09/27 10:37

ご指摘ありがとうございます! 今ようやく理解できました。インターフェースの基礎的な実装についての知識が欠けていました・・・。 大変お手数お掛け致しました。 改めて、Javaの基礎的な部分を学習します。 何度もご意見いただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問