Inversion of Control (IoC) 原則の実装である依存オブジェクト注入について以下整理する。 動作確認のための準備 †SpringのIoCコンテナのベースは、 <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 FrameworkのDI †
ApplicationContextは、GenericGroovyApplicationContextやClassPathXmlApplicationContextといったApplicationContextの共通実装である。実際には、これらの具象クラスを目的に応じて呼び分ける。 JavaEEでは、以前XML地獄と言われていたので、アノテーションやJavaプログラムベースの記述の方がポピュラーなのか??アノテーション地獄とも言われているのか・・・ まずは、イメージを掴むため、簡単なサンプルプログラムを見てみる。 サンプル スタンドアローンの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を読み込み、インスタンスやインスタンス組み立てのためのメタデータを |