記事ディレクトリ
この記事はGitHubでホストされています。GitHubで確認できます。スターへのボスを歓迎します。
WeChatの公開番号を検索してフォローし、さまざまな学習資料を受け取るオファーを入手してください。
Spring IOC(Inversion of Control)の深い理解
1.IOCの概要
Inverse Of Controlは、制御の反転、または略してIOCです。
簡単に言うと、IOCは、以前に依存オブジェクトを作成する方法から、ファクトリによってプッシュされる方法まで、依存関係を満たす方法を逆にします。(アクティブからパッシブへの変更、つまり逆)依存関係のあるコンポーネント間の強い結合を解決し、プロジェクトフォームをより堅牢にします
2. IOCとは何ですか?
2.1IOCの考え方を理解する
IOCは制御の反転であることはおそらく理解していますが、今ではその考えと機能がわかりません。それで問題は、IOC(Inversion of Control)とは何ですか?
制御の反転、略してIOC。名前が示すように、それは「コントロール」と「リバース」という言葉の組み合わせです。次に、つるをたどり、これら2つの単語を別々に分析します。
2.2制御
コントロールという言葉、私たちは多くのことを考える必要があります。たとえば、制御を実現するための条件は2つのオブジェクトである必要があります。制御は、誰が誰を制御し、何をするかを制御できます。次に、これらの状況を1つずつ列挙します。
- Javaでは、新しい方法でオブジェクトを作成します。開発者は開発ツールを制御し、プログラムの作成に必要な依存オブジェクトを間接的に制御します。プログラムの場合、オブジェクトの作成を直接制御します。IOCの場合はどうでしょうか。これは、IOCコンテナがオブジェクトの作成を直接制御する可能性があります
- オブジェクトの作成を制御するのはIOCですが、オブジェクトの作成をどのように制御しますか?IOCを使用してオブジェクトを作成するには、外部オブジェクトを導入するためのタグが必要です。これは、IOCコンテナが依存オブジェクトを作成するためのエントリポイントを制御することを示しています。
2.3リバース
逆転という言葉についてもよく考えます。たとえば、反転を実現するための条件は2つのオブジェクトである必要があります。反転がある場合は、順方向に回転し、次に何かが反転します。次に、1つずつ列挙します。
- Javaでは、オブジェクトを作成するための間接的なユーティリティであり、順方向ローテーションと見なすことができます。IOCコンテナを使用すると、すべてが一度に変更されました。新しいオブジェクトを自分で作成する必要はありませんが、直接反転して依存オブジェクトを作成し、IOCコンテナに保存します。
- IOCコンテナを使用してオブジェクトを作成するには、構成を通じて作成する必要のあるオブジェクトを指定し、IOCコンテナで作成されたオブジェクトを取得するために将来何を使用するか(IOCコンテナを構成するプロセス)を特定し、待機するだけです。 IOCコンテナ内のオブジェクトがこの一意の識別子を直接使用して取得するようにし、取得のプロセスでは、IOCがこの一意の識別子を使用してオブジェクトを検索して返す必要があります。
- たぶん何人かの友人はまだ逆転を理解していません。IOCコンテナの動作が、反転と呼ばれるオブジェクトの作成に役立つのはなぜですか?コンテナは依存オブジェクトの検索と挿入に役立つため、オブジェクトは依存オブジェクトを受動的に受け入れます。逆にしないとどうなりますか?開発者はオブジェクトを作成し、オブジェクトを検索、取得、および使用する必要があり、このプロセスのすべてが開発者によって制御されます
3、IOCの役割
制御の反転により、オブジェクトが作成されると、システム内のすべてのオブジェクトを規制する外部エンティティが、依存するオブジェクトの参照を渡します。依存関係がオブジェクトに注入されているとも言えます。
たとえば、クラスBのオブジェクトbはクラスAで使用されます。通常、AのコードでBオブジェクトを明示的に新規作成する必要があります。
IOCを使用した後はどうですか?Aのコードは、プライベートBオブジェクトを定義するだけでよく、このオブジェクトを取得するために直接新しい必要はありません。代わりに、Bオブジェクトは外部的に新しく、関連するコンテナ制御プログラムを介してAクラスの参照に挿入されます。特定の取得方法と取得時のオブジェクトの状態は、構成ファイル(xml)で指定されます。
オブジェクトの関係は構成ファイルで指定されるため、コンポーネント間の強い結合が大幅に減少し、メンテナンスが容易になり、プロジェクトがより堅牢で柔軟になります。
第四に、IOCはDao層とService層の間の強い結合を解決します
元のWeb開発では、DaoレイヤーとServiceレイヤーは切り離せません。Daoレイヤーはデータアクセスレイヤーであり、データベースのみを扱います。Servcieレイヤーは、対応するビジネスの実現のみを処理するビジネス処理レイヤーです。Web開発でDaoレイヤーとServiceレイヤーをつなぎ合わせる場合、Serviceレイヤーに新しいプライベートDaoレイヤー実装オブジェクト(XxxDaoImpl)が必要です。IOCのアイデアでは、従来のDaoレイヤーとServiceレイヤーの実装について考えることは非常に柔軟性がありません。Daoレイヤーの実装クラスを変更したら、プロジェクトのソースコードを変更する必要があります。明らかに非常に怖いです。事。
5. IOCを使用して、DaoレイヤーとServiceレイヤーの間の強い結合を解決します
DaoレイヤーとServiceレイヤーの間の強い結合を解決するので、これら2つのコンポーネントが必要ですよね?
Dao层
// Dao层接口
package com.mylifes1110.dao;
import com.mylifes1110.bean.User;
public interface UserDao {
int insertUser(User user);
}
// Dao层实现类
package com.mylifes1110.dao.impl;
import com.mylifes1110.bean.User;
import com.mylifes1110.dao.UserDao;
public class UserDaoImpl implements UserDao {
@Override
public int insertUser(User user) {
System.out.println("------insertUser and UserDao------");
return 0;
}
}
注: IOCを使用する場合、Daoレイヤー実装クラスオブジェクトをIOCコンテナーに挿入する必要があります。IOCコンテナーにオブジェクトを作成および取得するように指示する挿入メソッドが必要です。サービスレイヤーでは、新しい実装クラスオブジェクトは必要ありません。これは、UserDaoImplの依存関係をUserServcieImplに挿入するServiceレイヤーのSetterメソッドを作成することです(ここではアセンブリと考えることができます)。この時点で使用される挿入方法は、Setterメソッドの依存関係の挿入と呼ばれます。もつれる必要はありません。将来的にすべての依存関係を挿入します。依存関係インジェクションのアイデアと、依存関係インジェクションとIOCの関係を列挙および分析する方法。
サービス層
// Service层接口
package com.mylifes1110.service;
import com.mylifes1110.bean.User;
public interface UserService {
int insertUser(User user);
}
// Service层实现类
package com.mylifes1110.service.impl;
import com.mylifes1110.bean.User;
import com.mylifes1110.dao.UserDao;
import com.mylifes1110.service.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public int insertUser(User user) {
System.out.println("------insertUser and UserService------");
return userDao.insertUser(null);
}
}
spring-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/beans/spring-context.xsd">
<!--id:唯一标识 class:需要被创建的目标对象全限定名-->
<bean id="UserDao" class="com.mylifes1110.dao.impl.UserDaoImpl"/>
<!--id:唯一标识 class:需要被创建的目标对象全限定名-->
<bean id="UserService" class="com.mylifes1110.service.impl.UserServiceImpl">
<!--Setter方法依赖注入 name:Service层定义的userDao属性 ref:Dao层bean标签唯一标识-->
<property name="userDao" ref="UserDao"/>
</bean>
</beans>
テストクラス
/**
* @MethodName insertUser1
* @Param []
* @Description 测试IOC的使用
* @Author Ziph
* @Date 2020/7/12
*/
@Test
public void insertUser1() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
UserService userService = (UserService) context.getBean("UserService");
userService.insertUser(null);
// 打印结果
------insertUser and UserService------
------insertUser and UserDao------
}