1.コンセプト:
依存性注入(DI)は、制御の反転(IoC)と同じ意味ですが、2つの観点から説明したのと同じ概念です。春の初心者にとって、これら2つの名前は理解しにくいので、これら2つの概念を簡単な言葉で説明します。
比較を使用します。
1.使用前:
Javaオブジェクト(呼び出し元)が別のJavaオブジェクト(呼び出し先、つまり依存オブジェクト)を呼び出す必要がある場合、従来のモードでは、呼び出し元は通常、「新しい呼び出し先」コードメソッドを使用してオブジェクトを作成します。この方法では、呼び出し元と呼び出し先の間の結合が増加しますが、これは後のプロジェクトのアップグレードと保守に役立ちません。
2.使用後:
Springフレームワークを使用した後、オブジェクトのインスタンスは呼び出し元によって作成されなくなりますが、呼び出し元のプログラムコードによって直接制御されるのではなく、プログラム間の関係を制御するSpringフレームワークのコンテナーによって作成されます。このようにして、制御権はアプリケーションコードからSpringフレームワークコンテナに転送され、制御権は逆になります。これは、Springフレームワークの制御の反転です。
Spring Frameworkコンテナーの観点からは、依存オブジェクトを呼び出し元のメンバー変数に割り当てる必要があります。これは、呼び出し元が依存インスタンスを注入するのと同じです。これは、SpringFrameworkの依存性注入です。
2.制御の反転(Ioc)を理解する:
制御の反転は、依存性注入とも呼ばれ、プログラムコード間の結合を減らすためのオブジェクト指向プログラミングの設計概念であり、MVC設計パターンでよく使用されます。まず、依存関係とは何かを検討します。コードの依存関係とは、通常、ローカル変数、メソッドパラメータ、戻り値などを介して確立された他のオブジェクトとの呼び出し関係を指します。たとえば、クラスAのメソッドでは、クラスBのオブジェクトがインスタンス化され、そのメソッドが呼び出されて特定の関数が完了します。つまり、クラスAはクラスBに依存します。
ほとんどすべてのアプリケーションは、完全な機能を実現するために相互に連携する2つ以上のクラスで構成されています。クラス間の依存関係により、プログラム開発の複雑さが増します。クラスを開発するときは、そのクラスを使用している他のクラスへの影響を考慮してください。たとえば、共通のビジネスレイヤーは、データアクセスレイヤーを呼び出して永続的な操作を実装します。問題を解決する手順は次のとおりです。
(1)Spring開発キットを入手し、Springフレームワークサポートをプロジェクトに追加します
(2)ビジネス層とデータアクセス層のインターフェースに必要なメソッドを宣言します
(3)データアクセス層インターフェースUserDaoの実装クラスを記述して、特定の永続化操作を完了します
(4)ビジネス実装クラスでUserDaoインターフェイスタイプの属性を宣言し、適切なコンストラクターを追加して属性に値を割り当てます
(5)Spring構成ファイルで、インジェクションを作成して、DAOオブジェクトをビジネスインスタンスのUserDaoタイプ属性に割り当てます。
(6)プログラム機能を実現するために、コード内のSpring構成ファイルによってアセンブルされたビジネスクラスオブジェクトを取得します。
3. IoCの適用方法:
IoCコンテナの構成プロパティの構文
最初の方法:
Book.java
package cn.spring.ioc.demo.exercise;
public class Book {
private Integer id;
private String bookName;
private Float price;
public Integer getId() {
return id;
}
public String getBookName() {
return bookName;
}
public Float getPrice() {
return price;
}
public void setId(Integer id) {
this.id = id;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public void setPrice(Float price) {
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", bookName='" + bookName + '\'' +
", price=" + price +
'}';
}
}
容器配置:
<bean id="book1" class="cn.spring.ioc.demo.exercise.Book">
<property name="id" value="1001"/>
<property name="bookName" value="C++基础编程"/>
<property name="price" value="28.2"/>
</bean>
2番目の方法:
Book_1.java
package cn.spring.ioc.demo.exercise;
public class Book_1 {
private Integer id;
private String bookName;
private Float price;
public Book_1(Integer id,String bookName,Float price){
this.id = id;
this.bookName = bookName;
this.price = price;
}
public Integer getId() {
return id;
}
public String getBookName() {
return bookName;
}
public Float getPrice() {
return price;
}
public void setId(Integer id) {
this.id = id;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public void setPrice(Float price) {
this.price = price;
}
@Override
public String toString() {
return "Book_1{" +
"id=" + id +
", bookName='" + bookName + '\'' +
", price=" + price +
'}';
}
}
容器配置:
<bean id="book2" class="cn.spring.ioc.demo.exercise.Book_1">
<constructor-arg index="0" value="1002"/>
<constructor-arg index="1" value="Java/>
<constructor-arg index="2" value="33.3"/>
</bean>
3番目の方法:
BookFactory.java
package cn.spring.ioc.demo.exercise;
public class BookFactory {
public Book getBookInstance(Book book){
return book;
}
}
容器配置:
<bean id="book3" class="cn.spring.ioc.demo.exercise.Book">
<property name="id" value="1004"/>
<property name="bookName" value="go"/>
<property name="price" value="88.2"/>
</bean>
<bean id="factory" class="cn.spring.ioc.demo.exercise.BookFactory" />
<bean id="finstance" factory-bean="factory" factory-method="getBookInstance">
<constructor-arg index="0" ref="book3"/>
</bean>
4番目の方法:
Book_1Factory.java
package cn.spring.ioc.demo.exercise;
public class Book_1Factory {
public static Book_1 getBookInstance(Integer id,String bookName,Float price){
return new Book_1(id, bookName, price);
}
}
容器配置:
<bean id="bf" class="cn.spring.ioc.demo.exercise.Book_1Factory" factory-method="getBookInstance">
<constructor-arg index="0" value="1003"/>
<constructor-arg index="1" value="python"/>
<constructor-arg index="2" value="99.9"/>
</bean>