依存注入


DIとは何ですか。


Dependency Injection. 依存性注入とも呼ばれる.
依存オブジェクトBが変化すると、Aに影響します.
  • 李日民、トビーの春3.1、愛康(2012)、p 113
  • つまり、Bの機能が修正されると、Aに影響します.
    次のコードはハンバーガー店を例に挙げます.

    一般依存関係


    「ハンバーガー店シェフがハンバーガーレシピに頼る」は簡単な言葉です.ハンバーガーレシピがなければ、シェフは料理ができません.レシピを修正したり、他のハンバーガーを作ったりする必要がある場合は、シェフは料理方法を修正しなければなりません.レシピがシェフに影響を及ぼしているので、シェフはレシピに依存しています.そう言ってもいいです.
    class BurgerChef {
    	private BurgerRecipe burgerRecipe;
        
        public BurgerChef() {
        	this.burgerRecipe = new BurgerRecipe();
        }
    }
    
    上記のコードのように、BurgerChefはBurgerRecipeに依存します.より多くの処方箋を依存させるためには,以下のコードのように依存関係をインタフェースとして抽象化する必要がある.
    class BurgerChef {
    	private BurgerRecipe burgerRecipe;
        
        public BurgerChef() {
        	this.burgerRecipe = new BurgerRecipe();
            //this.burgerRecipe = new ChickenBurgerRecipe();
            //this.burgerRecipe = new CheeseBurgerRecipe();
        }
    }
    
    interface BurgerRecipe(){
    	newBurger();
    }
    
    class NewBurgerRecipe implements BurgerRecipe(){
    	public Burger newBurger(){
        	return Hamburger();
        }
    }
    

    依存注入方式


    依存性をインタフェースとして抽象化すれば,コックはより多様な依存関係を持つことができる.(より多くのメニューを選ぶことができます)この方法はシェフが内部でハンバーガーのレシピを決め、外部から直接メニューを選んでシェフに直接頼む(注入する)としたら?
    △スレ主が自分で料理を選んだら?

    ジェネレータ使用DI

    class BurgerChef { // 생성자를 이용한 DI
    	private BurgerRecipe burgerRecipe;
        
        public BurgerChef(BurgerRecipe burgerRecipe) {
        	this.burgerRecipe = burgerRecipe;
        }
    }
    
    class BurgerShopOwner {
    	private Burgerchef burgerchef = new BurgerChef(new NewBurgerRecipe());
        
        public void changeMenu(){
        	burgerchef = new BurgerChef(new CheeseBurgerRecipe());
        }
    }
    このようにコードを書くと、ハンバーガーシェフはハンバーガー店の店主が注入したメニューを作ります.この手法を依存注入と呼ぶ.
    それ以外にも、Setter(メソッド)を使ったDIやフィールドインジェクションなど多くのDI方式がありますが、Springではジェネレータを使う方式がおすすめです.

    使用方法のDI

    class BurgerChef { //메소드(setter)를 사용한 DI
    	private BurgerRecipe burgerRecipe = new BurgerRecipe();
        public void setBurgerRecipe(BurgerRecipe burgerRecipe){
    		this.burgerRecipe = burgerRecipe;
        }
    }
    
    class BurgerShopOwner {
    	private Burgerchef burgerchef = new BurgerChef();
        
        public void changeMenu(){
        	burgerChef.setBurgerRecipe(new cheeseBurgerRecipe());
        }
    }

    長所

  • 依存性が低減され、注入の目標が変化しても実施自体が修正または低減されない.
  • 再使用性が向上しました.-以前はBurgerChefの内部でのみ使用されていたBurgerRecipeは、他のクラスで使用できるようになりました.
  • BurgerRecipeは、BurgerChefとは別にテストすることができる.
  • BurgerChefおよびBurgerRecipeの拡張性が向上しました.
  • 整理する

  • Dependency Injectionは、別のオブジェクトを宣言して作成することによって、別のオブジェクトの外部注入を使用します.
  • DIにはいくつかの実装方法がありますが、ジェネレータを使用することをお勧めします.
  • DIは、オブジェクトの作成と使用に対する関心を分離することを意図している.
  • ソース


    https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/
    https://mangkyu.tistory.com/125