Spring

Inversion of Control (IoC) 原則の実装である依存オブジェクト注入について以下整理する。

動作確認のための準備

SpringのIoCコンテナのベースは、org.springframework.beansorg.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プログラム)から得る。

ApplicationContextは、GenericGroovyApplicationContextやClassPathXmlApplicationContextといったApplicationContextの共通実装である。実際には、これらの具象クラスを目的に応じて呼び分ける。

ApplicationContext.png

JavaEEでは、以前XML地獄と言われていたので、アノテーションやJavaプログラムベースの記述の方がポピュラーなのか??アノテーション地獄とも言われているのか・・・

まずは、イメージを掴むため、簡単なサンプルプログラムを見てみる。
以下は、スタンドアローンで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
    }
}

サンプルプログラムから動作イメージを掴むことができる。ClassPathXmlApplicationContextは、services.xmlを読み込み、インスタンスやインスタンス組み立てのためのメタデータを


*1 参考リンク:https://kakutani.com/trans/fowler/injection.html

添付ファイル: fileApplicationContext.png 69件 [詳細]

PR

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-07-04 (水) 00:20:08 (527d)
目次
ダブルクリックで閉じるTOP | 閉じる
GO TO TOP