- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- Spring/SpringFramework/Core/IoC へ行く。
- 1 (2018-07-01 (日) 22:01:56)
- 2 (2018-07-01 (日) 22:11:43)
- 3 (2018-07-02 (月) 05:37:07)
- 4 (2018-07-03 (火) 09:16:58)
Inversion of Control (IoC) 原則の実装である依存オブジェクト注入について以下整理する。
動作確認のための準備 †
SpringのIoCコンテナのベースは、org.springframework.beans
とorg.springframework.context
パッケージから構成されている。動作確認しながら仕組みを理解するために、Eclipse等のIDEでMavenプロジェクトを作成し、以下の設定をpon.xmlに追加しておくと良い。
<dependencies> <!-- https://mvnrepository.com/artifact/org.springframework/spring-core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.0.7.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.7.RELEASE</version> </dependency> </dependencies>
参考 https://mvnrepository.com/artifact/org.springframework
Dependency Injection †
設定を利用から分離するための仕組みのこと*1。
コンポーネントの依存関係をソースコードから排除し、外部の設定ファイルなどから依存関係を注入する。
具体的に例を見たほうが分かりやすいと思うので、以下SpringのDIについてサンプルプログラムを通して見ていく。
Spring FrameworkのDI †
org.springframework.context.ApplicationContext
がインスタンスの生成、構成や組み立ての管理をしてくれる。- ApplicationContextは、インスタンスの生成や組み立てに必要な情報をメタデータ(XMLファイル、アノテーション、Javaプログラム)から得る。
JavaEEでは、以前XML地獄と言われていたので、アノテーションやJavapプログラムベースの記述の方がポピュラーなのか??
まずは、イメージを掴むため、簡単なサンプルプログラムを見てみる。
以下は、スタンドアローンでDIを利用する例。
サンプル スタンドアローンのDIの利用例
- src/main/java |- app.MyDISample.java |- beans.MyBean.java - src/main/resources |- services.xml
services.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"> <!-- myBeanを利用するための設定 --> <bean id="myBean" class="beans.MyBean"> <property name="name" value="taro" /> <property name="age" value="20" /> </bean> </beans>
beans.MyBean.java
package beans; public class MyBean { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
app.MyDISample.java
package app; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import beans.MyBean; public class MyDISample { public static void main(String... args) { // メタデータのロード ApplicationContext context = new ClassPathXmlApplicationContext("services.xml"); // myBeanオブジェクトの取得 MyBean bean = context.getBean("myBean", MyBean.class); System.out.println(bean.getName()); // => taro System.out.println(bean.getAge()); // => 20 } }