ishowcode.eth

ishowcode.eth

区块链小白

Springの概要とIOCの詳細

Spring の概要と設定#

学習目標#

【アプリケーション】springIOC の迅速な入門を独立して完了できる
【アプリケーション】spring の bean タグの設定を習得できる
【アプリケーション】bean のオブジェクト属性の注入を独立して完了できる
【アプリケーション】bean の通常属性の注入を独立して完了できる
【理解】bean のコレクション属性の注入を独立して完了できる

1、Spring の概要#

1.1 spring とは#

ここに画像の説明を挿入

Spring は、IoC(制御の反転)と AOP(アスペクト指向プログラミング)を核とした、層状の Java SE/EE アプリケーションのフルスタック軽量オープンソースフレームワークです。
表現層の SpringMVC や永続層の Spring JDBCTemplate、ビジネス層のトランザクション管理など、多くのエンタープライズレベルのアプリケーション技術を提供し、オープンソースの世界の多くの著名なサードパーティフレームワークやライブラリと統合できるため、最も使用される Java EE エンタープライズアプリケーションのオープンソースフレームワークとなっています。

1.2 Spring の発展の歴史#

1997 年、IBM が EJB の概念を提唱
1998 年、SUN が EJB1.0 の開発標準を策定
1999 年、EJB1.1 がリリース
2001 年、EJB2.0 がリリース
2003 年、EJB2.1 がリリース
2006 年、EJB3.0 がリリース
ロッド・ジョンソン(Spring の父)
ここに画像の説明を挿入

Expert One-to-One J2EE Design and Development(2002)は、J2EE で EJB を使用して開発設計する利点と解決策を述べています。
Expert One-to-One J2EE Development without EJB(2004)は、J2EE 開発で EJB を使用しない解決策(Spring のプロトタイプ)を述べています。
2021 年 7 月に Spring の最新バージョン Spring 5.3.9 がリリースされました。

1.3 Spring の利点(理解)#

\1. 簡単なデカップリング、開発の簡素化#

Spring は大きな工場(IoC コンテナ)であり、すべてのオブジェクトの作成と依存関係の管理を Spring コンテナに任せることができ、コンポーネント間の結合度を大幅に低下させます。

\2. AOP プログラミングのサポート#

Spring の AOP 機能を通じて、アスペクト指向プログラミングを簡単に行うことができ、従来の OOP では実現が難しい多くの機能を AOP を通じて簡単に実現できます。
例えば、プログラムに対する権限のインターセプトや実行監視などの機能を実現します。

\3. 宣言的トランザクションのサポート#

単調で退屈なトランザクション管理コードから解放され、宣言的な方法で柔軟にトランザクション管理を行うことで、開発効率と品質を向上させます。

\4. プログラムのテストが容易#

Spring は Junit4 をサポートしており、アノテーションを通じて Spring プログラムを簡単にテストでき、テストはもはや高価な操作ではなく、手軽に行えることになります。

\5. 様々な優れたフレームワークとの統合が容易#

Spring は様々な優れたオープンソースフレームワークを排除せず、その内部で Struts、Hibernate、MyBatis、Quartz などの優れたフレームワークへの直接サポートを提供しています。

\6. JavaEE API の使用難易度の低減#

Spring は JavaEE 開発で非常に使いにくい API(JDBC、JavaMail、リモート呼び出しなど)をラッピングし、これらの API の使用難易度を大幅に低下させます。

\7. Java のソースコードはクラシックな学習の例#

Spring のソースコードは巧妙に設計され、構造が明確で、職人の独自の工夫が随所に見られ、マスターが Java デザインパターンを柔軟に適用し、Java 技術に対する深い造詣を示しています。そのソースコードは無意識のうちに Java 技術のベストプラクティスの例となっています。

1.4 Spring の体系構造(理解)#

ここに画像の説明を挿入

2、Spring IoC の迅速な入門#

2.1 IoC の概念と役割#

IoC:制御の反転(Inversion Of Control)とは、アプリケーション自体が依存オブジェクトの作成と管理を担当せず、依存オブジェクトの作成と管理は外部コンテナが担当することを意味します。こうすることで、制御権がアプリケーションから外部コンテナに移転し、制御権の移転がいわゆる反転です。

簡単に理解すると、オブジェクトの作成、初期化、破棄などの作業を Spring コンテナに任せることです。Spring コンテナがオブジェクトのライフサイクルを管理します。

IoC の役割を明確にすると、コンピュータプログラムの結合度を削減(コード内の依存関係を解除)します。
以前は、オブジェクトを取得する際に、new の方法を使用していました。これは能動的です。
現在は、オブジェクトを取得する際に、Spring コンテナに要求し、Spring が私たちのためにオブジェクトを検索または作成します。これは受動的です。

2.2 Spring IoC プログラム開発のステップ#

① Spring 開発の基本パッケージ座標をインポート
② Dao インターフェースと実装クラスを作成
③ Spring のコア設定ファイルを作成
④ Spring 設定ファイルに UserDaoImpl を設定
⑤ Spring の API を使用して Bean インスタンスを取得

2.3 Spring 開発の基本パッケージ座標をインポート#

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring‐context</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>

2.4 Dao インターフェースと実装クラスを作成#

package com.summer.dao;
public interface UserDao {
public void save();
} 

package com.summer.dao.impl;
import com.summer.dao.UserDao;
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("ユーザー追加~~~~~");
}
}

2.5 Spring のコア設定ファイルを作成#

クラスパス classpath 下(resources)に applicationContext.xml 設定ファイルを作成

<?xml version="1.0" encoding="UTF‐8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
</beans>

2.6 Spring 設定ファイルに UserDaoImpl を設定#

<?xml version="1.0" encoding="UTF‐8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<!‐‐ IoCを実現し、オブジェクトの作成をspringコンテナに委任
UserDao userDao = new UserDaoImpl();
‐‐>
<bean id="userDao" class="com.bailiban.dao.impl.UserDaoImpl"></bean>
</beans>

2.7 Spring の API を使用して Bean インスタンスを取得#

public class TestIoC{
public static void main(String[] args) {
// Springコンテナインスタンスを作成
ApplicationContext context = new
ClassPathXmlApplicationContext("applicationContext.xml");
//コンテナからbeanを取得、ユニークな識別子idで取得
UserDao userDao = (UserDao) context.getBean("userDao");
userDao.save();
}
}

クラスパス下で設定ファイルを探してコンテナをインスタンス化
Spring の迅速な入門コードの強化練習
springIoC の XML 設定方式を通じてオブジェクトのインスタンス化を練習
\1. 座標をインポート
\2. Bean を作成
\3. 設定ファイル applicationContext.xml を作成
\4. 設定ファイルで設定を行う
\5. ApplicationContext オブジェクトを作成し getBean を呼び出す

3、Bean の依存注入入門#

① Dao、Service インターフェースと実装クラスを作成

public interface UserDao {
public void save();
} 
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("ユーザー追加~~~~~");
}
} 
public interface UserService {
public void save();
} 
public class UserServiceImpl implements UserService {
public void save() {
//TODO
}
}

②UserDaoImpl、UserServiceImpl の作成権を Spring に委任

<
!‐‐ spring IoCがオブジェクトの作成権をspringに委任‐‐>
<bean id="userDao" class="com.bailiban.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.bailiban.service.impl.UserServiceImpl"></bean>

UserService 内部で UserDao の save () メソッドを呼び出す

public class UserServiceImpl implements UserService {
public void save() {
// Springコンテナインスタンスを作成
ApplicationContext context = new ClassPathXmlApplicationContext();
// idでdaoオブジェクトを取得
UserDao userDao = (UserDao) context.getBean("userDao");
// メソッドを呼び出す
userDao.save();
}
}

③Spring コンテナから UserService を取得して操作

public class TestDI {
// DIの迅速な入門テスト
@Test
public void test1() {
// Springコンテナインスタンスを作成
ApplicationContext context = new
ClassPathXmlApplicationContext("applicationContext.xml");
// idでdaoオブジェクトを取得
UserService userService = (UserService) context.getBean("userService");
// メソッドを呼び出す
userService.save();
}
}

3.1 Bean の依存注入の分析#

現在、UserService インスタンスと UserDao インスタンスは Spring コンテナ内に存在しており、現在のやり方はコンテナ外で UserService インスタンスと UserDao インスタンスを取得し、プログラム内で結合することです。
ここに画像の説明を挿入

UserService と UserDao がどちらも Spring コンテナ内にあるため、最終的にプログラムが直接使用するのは UserService であるため、Spring コンテナ内で UserDao を UserService 内部に設定できます。

ここに画像の説明を挿入

3.2 Bean の依存注入の概念#

DI : 依存注入(Dependency Injection)とは、IoC の環境が必要で、Spring がオブジェクトを作成する過程で、Spring がオブジェクトの依存属性をオブジェクトに注入します。

プログラムを作成する際に、制御の反転を通じてオブジェクトの作成を Spring に委任しましたが、コード内には依存関係がない状況は存在しません。

IoC によるデカップリングは、依存関係を減少させるだけで、排除することはありません。例えば、ビジネス層は依然として永続層のメソッドを呼び出します。
このビジネス層と永続層の依存関係は、Spring を使用した後、Spring に維持させることになります。
簡単に言えば、フレームワークが永続層オブジェクトをビジネス層に渡すのを待つだけで、私たちが自分で取得する必要はありません。

3.3 Bean の依存注入の方法#

UserDao をどのように UserService 内部に注入するのでしょうか?

3.3.2 set メソッド#

UserServiceImpl に setUserDao メソッドを追加

public class UserServiceImpl implements UserService {
// daoメンバー変数を定義
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
} 
public void save() {
// // Springコンテナインスタンスを作成
// ApplicationContext context = new
ClassPathXmlApplicationContext("applicationContext.xml");
// // idでdaoオブジェクトを取得
// UserDao userDao = (UserDao) context.getBean("userDao");
// // メソッドを呼び出す
userDao.save();
}
}

Spring コンテナに set メソッドを呼び出して注入を設定


<bean id="userDao" class="com.bailiban.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.bailiban.service.impl.UserServiceImpl">
<!‐‐ setメソッドを使用して注入
name: setメソッドのsetを取り除き、最初の文字を小文字にする
‐‐>
<property name="userDao" ref="userDao"></property>
</bean>

set メソッド:P 名前空間注入
P 名前空間注入は本質的には set メソッド注入ですが、上記の set メソッド注入よりも便利で、主に設定ファイルにおいて次のように表れます。
まず、P 名前空間をインポートする必要があります:

xmlns:p="http://www.springframework.org/schema/p"

次に、注入方法を変更します。

<bean id="userService" class="com.bailiban.service.impl.UserServiceImpl" p:userDao‐
ref="userDao">

3.4 Bean の依存注入のデータ型#

上記の操作は、すべて参照 Bean の注入です。オブジェクトの参照だけでなく、通常のデータ型などもコンテナに注入できます。
注入データの二つのデータ型

  1. 通常のデータ型
  2. 参照データ型
    参照データ型についてはここでは詳述しませんが、以前の操作は UserDao オブジェクトの参照を注入するものでした。以下では set メソッド注入を例に、通常のデータ型の注入を示します。
    Bean の依存注入のデータ型
    (1)通常のデータ型の注入
    練習:
public class UserDaoImpl implements UserDao {
//通常のデータ型の注入
private String name;
private int age;
public void setName(String name) {
this.name = name;
} 
public void setAge(int age) {
this.age = age;
} 
public void save() {
System.out.println(name+"‐‐‐"+age);
System.out.println("ユーザー追加~~~~~");
}
} 

<bean id="userDao" class="com.bailiban.dao.impl.UserDaoImpl">
<!‐‐ 通常データの注入 ‐‐>
<property name="name" value="旺財"></property>
<property name="age" value="18"></property>
</bean>
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。