IoC,依存性逆転


Inversion of Control

IoC依存性逆転は、ユーザが作成したプログラムが再利用ライブラリトラフィックによって制御されるソフトウェア設計モードであるIoCはSpring Frameworkが持つコア開発概念DI依存注入を理解するために必要な概念である.IoCは、実行に必要なオブジェクトの作成/使用などの制御権限をFrameworkに委任することによって、クライアントコードの注意すべき部分を減らすポリシーとして理解されます.
これらの戦略により、次のようなメリットが得られました.
依存性の逆転を使用することで、オブジェクト間の結合度を緩め、柔軟なコードを記述することができ、可読性/重複コード/メンテナンスを容易にすることができます.

オブジェクト間の結合


依存性が持つ機械的定義は何ですか.
依存性Dependencyは、ある特定のオブジェクトが存在するために存在しなければならないものとその関係を表す.
依存性は、コード内のnewキーワードから構成される.
class Player {
	
    private Item item;
    
    Player() {}
    
    void setItem() {
    	this.item = new Item();
    }
    
}
次のように記述されたコードをフォーマットします.

以下に、オブジェクト間の強い結合Tightly Coupledを示します.これにより、コードの柔軟性/可読性が低下し、コードが重複します.
このような強い結合を除去し,コードの柔軟性を失わない方法の1つは,逆転依存性である.
class Potion implements Item {

	public void useItem() {
    	System.out.println("Use Potion");
    }
}

class Shoes implements Item {

	public void useItem() {
    	System.out.println("Use Shoes");
    }
}

class Gun implements Item {

	public void useItem() {
    	System.out.println("Use Gun");
    }
}

interface Item {
	void useItem();
}

public class Users {

    private Item item;

    Users(){
    }

    public void setItem(Item item) {
        this.item = item;
    }

    public void useUsersItem() {
        item.useItem();
    }
}

public class Main {

    public static void main(String[] args) {
        
        Users user = new Users();

        user.setItem(new Potion());
        user.useUsersItem();

        user.setItem(new Shoes());
        user.useUsersItem();

        user.setItem(new Gun());
        user.useUsersItem();
    }
}

    // Result : 
    Use Potion
    Use Shoes
    Use Gun
上のコードを以下のようにフォーマットします.

このような設計コードにより,ItemのInstanceへの依存性が弱まる.ユーザが特定の状況でItemを使用したい場合は、実装されたItemインスタンスをインタフェースに基づいて置き換えることができる.
すなわち,オブジェクト間の結合を緩和することで,コードの柔軟性/可読性を向上させ,コードの重複を必然的に解消することができる.

IoC Container


SpringはContainerです.これは、ユーザーがコードを記述する処理プロセスを許可する独立した存在であり、適切に設定されている場合、誰も助けてくれない場合、作成されたコードを自動的に参照し、オブジェクトの作成/破棄を制御することを意味します.
上記のコードを例にとると、SpringはUsers/Potion/Gunなどのコンテンツがcontainerである場所でShoesというInstanceとして管理される.このコンテナはBeanと呼ばれます.
xmlプロファイルまたはJavaプロファイルから設定値を入力すると、Springはこの情報に基づいてcontainerを作成し、プロファイルに登録されているbeanオブジェクトを管理します.
各beanオブジェクトが持つ依存性がプロファイルに入力された情報に基づいてcontainerを作成すると、後述するIoC Container依存性注入と呼ばれる依存性が自動的に注入されます.
依存性注入の過程では,依存性逆転の原則から逸脱することはできない.