春のIoC(制御の反転)

では、公式文書、をクリックしてCoreコアパッケージと、それを開いて、あなたは、開口部の章では、約であることを見つけることができIoCた容器。したがって、最初に理解してくださいIoCいつものように、Baiduエントリから開始ます

制御の反転(Inversion of Control、と略記IoC)は、オブジェクト指向プログラミングの設計原則であり、コンピューターコード間の結合度減らすために使用できます最も一般的な方法は依存性注入(Dependency Injection略してDI)と呼ばれ、別の方法は「依存性ルックアップ」(Dependency Lookupと呼ばれます。制御の反転により、オブジェクトが作成されると、システム内のすべてのオブジェクトを規制する外部エンティティが、依存するオブジェクトの参照を渡します。依存関係がオブジェクトに注入されているとも言えます。パターンファクトリパターンの昇華と見なす
ことができIoCIoCコンテナは大きなファクトリと見なすことができますが、この大きなファクトリで生成されるオブジェクトはすべてXMLファイルで定義されています。Java「リフレクション」プログラミングを使用して、対応するオブジェクトがXMLで指定されたクラス定義に従って生成されます。実装の観点から、以前はファクトリモードでデッドに書き込まれていたオブジェクトは、IoC構成XMLファイルに変更されます。これにより、ファクトリと生成されるオブジェクトが分離され、柔軟性と保守性が大幅に向上します。IoC真ん中の最も基本的なJavaテクノロジーは「リフレクション」プログラミングです。素人の用語では、リフレクションは、指定されたクラス名(文字列)に基づいてオブジェクトを生成することです。このプログラミング方法により、アプリケーションは実行時に生成するオブジェクトを動的に決定できます。

言い換えれば、これIoCはプログラミングのアイデアであり、主にコード間​​の結合を減らすために使用されます。具体的には、オブジェクトを作成するときに、クラシックnewを使用してオブジェクトを作成する必要はありませんが、リフレクションをxmlファクトリオブジェクトとプロダクションオブジェクトの分離と組み合わせて使用​​することで、柔軟性が向上します。

以前のwebプロジェクト開発では、通常、次の実装を記述します。

  • Dao、DaoImpl
  • Service、ServiceImpl

:複数の実装がある場合にデータをロードするには、我々のような継承特定のインターフェース、ことを複数実装クラスを記述する必要がある場合には、ある
daoUserDaoUserDaoImpl、それぞれ、二つのクラス:

public interface UserDao {
    
    
    String getUserName();
}
public class UserDaoImpl implements UserDao {
    
    
    @Override
    public String getUserName() {
    
    
        return "User!";
    }
}

次に、service2つのクラスUserServiceUserServiceImpl2つのクラスをそれぞれ含むレイヤーを作成できます。内容は次のとおりです。

public interface UserService {
    
    
    void getUserName();
}
public class UserServiceImpl implements UserService{
    
    
    UserDao userDao = new UserDaoImpl();

    @Override
    public void getUserName() {
    
    
        System.out.println(userDao.getUserName());
    }
}

次に、次のようなテストクラスを作成します。

class UserServiceImplTest {
    
    

    UserService userService = new UserServiceImpl();
    @Test
    void getUserName() {
    
    
        userService.getUserName();
    }
}

プロジェクトは次のように構成されています。
ここに画像の説明を挿入します
テスト結果:
ここに画像の説明を挿入します
上記は単純な呼び出しであり、問​​題はないようですが、私たちのDaoレベルでは、時間の複数の実現がある場合ServiceImplDao実装で対応するものを変更する必要があります。基になるデータソーススイッチ。明らかに、開発のニーズに動的に適応させることはできません。
解決策:set動的に設定するために使用する

public class UserServiceImpl implements UserService{
    
    
    UserDao userDao;

    // 动态注入
    public void setUserDao(UserDao dao){
    
    
        this.userDao = dao;
    }

    @Override
    public void getUserName() {
    
    
        System.out.println(userDao.getUserName());
    }
}
// 此时的测试类
class UserServiceImplTest {
    
    

    UserService userService = new UserServiceImpl();
    @Test
    void getUserName() {
    
    
        ((UserServiceImpl)userService).setUserDao(new UserDaoImpl());
        userService.getUserName();
    }
}

このようにして、基盤となるデータソースの変更を動的に設定することが可能になり、顧客サービスのニーズや動的な変更に簡単に適応できます。
ここに考えがあります:基礎となるデータソースの元のイニシアチブはプログラマーの手にありますが、現在のsetインジェクション方法では、イニシアチブは呼び出す必要のある人の手にあり、他の人がどのメソッドを呼び出すことができるようになります彼らが必要とする。この種の考え方は、制御の反転です。


ビデオアドレス:https//www.bilibili.com/video/BV1WE411d7Dv?p = 3

おすすめ

転載: blog.csdn.net/qq_26460841/article/details/115024207