前提
コンストラクタインジェクションが理解できません。
下記プログラムの内容を理解したいです。
①~④はインジェクションの動作確認パターンとなります。
①は理解できますが②~④の動作が理解できず困っています。
インターフェイス、実行クラス、使われるクラス + ①or②or③or④ という形で動作確認を
しています。
該当のソースコード
Java
1インターフェイス 2public interface Example { 3 /** 実行 */ 4 void run(); 5}
Java
1使われるクラス 2@Component 3public class SomeService { 4 5 /** サービス処理 */ 6 public void doService() { 7 System.out.println("あるサービス"); 8 } 9}
Java
1実行クラス 2@SpringBootApplication 3public class InjectionSampleApplication { 4 5 public static void main(String[] args) { 6 SpringApplication.run(InjectionSampleApplication.class, args) 7 .getBean(InjectionSampleApplication.class).exe(); 8 } 9 /** DI */ 10 @Autowired 11 private Example example; 12 13 /** 実行 */ 14 private void exe() { 15 example.run(); 16 } 17 18}
Java
1①フィールドインジェクション 2@Component 3public class FieldInjectionExample implements Example { 4 5 /** フィールドインジェクション */ 6 @Autowired 7 private SomeService someService; 8 9 //SomeService someService = new SomeService(); 10 11 /** 実行 */ 12 @Override 13 public void run() { 14 someService.doService(); 15 } 16}
②コンストラクタインジェクション //@Component public class ConstructorInjectionExample implements Example { /** フィールド */ private final SomeService someService; /** コンストラクタインジェクション */ //@Autowired public ConstructorInjectionExample(SomeService someService) { this.someService = someService; } /** 実行 */ public void run() { someService.doService(); } }
③コンストラクタインジェクションアノテーションなし //@Component public class ConstructorInjectionOmitExample implements Example { /** フィールド */ //SomeService someService = new SomeService(); private final SomeService someService; /** コンストラクタインジェクション */ public ConstructorInjectionOmitExample(SomeService someService) { this.someService = someService; } /** 実行 */ public void run() { someService.doService(); } }
④コンストラクタインジェクションアノテーションなし&Lombok //@Component @RequiredArgsConstructor public class ConstructorInjectionOmitLombokExample implements Example { /** フィールド */ private final SomeService someService; // コンストラクタが省略できる /** 実行 */ public void run() { someService.doService(); } }
試したこと
①のフィールドインジェクションの動作は理解できるのですが②③のところで
public ConstructorInjectionOmitExample(SomeService someService) {
this.someService = someService;
この部分がなにをしてるかが理解できません。コンストラクタはフィールドの初期値を設定
するという認識ですが、SomeServiceクラスにはフィールドが存在していません。
またthis.someService = someServiceこの部分は自分自身に自分自身のインスタンスを
設定している?という部分もどういう動きなのかが理解できません。
④の内容が理解できず調べた結果②③の動作が理解できないと④も理解できないと思い現在
調べている最中です。
お手数おかけしますがご教授いただけると幸いです。
以上よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー