Springフレームワークのススメ1

はじめに

世の中にはフレームワークと呼ばれる、開発を効率的に行える仕組みが存在する。
私は普段Javaを触っているが、JavaフレームワークにはStrutsとかSpringとかいろいろある。よく聞くのはSpringか。
名前は聞いたことがあるが、正直よく分かっていない。
本記事では、このSpringに触りの部分ついて、実例を交えながらまとめる。
※この記事でSpringフレームワークについて全部記載できるとは思っていない。何回かに分けてまとめていけたらと思う。

Springフレームワークの実例

いきなりだが、Springフレームワークを使った超簡単なプログラム例を以下に示す。

■設定ファイル: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">

	<bean id="greeting" class="jp.co.myApp.component.Greeting">
		<property name="hello" ref="hello" />
	</bean>
	<bean id="hello" class="jp.co.myApp.component.Hello" />
</beans>

■Mainクラス

package jp.co.myApp.client;

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import jp.co.myApp.component.Greeting;

public class Main {
	public static void main(String[] args) {
		try {
			ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
			Greeting greeting = context.getBean(Greeting.class);
			greeting.sayHello();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

■Greetingクラス

package jp.co.myApp.component;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Greeting {
	private Hello hello;

	@Autowired
	public void setHello(Hello hello) {
		this.hello = hello;
	}

	public void sayHello() {
		this.hello.sayHello();
	}
}

■Helloクラス

package jp.co.myApp.component;

public class Hello {
	private String greeting = "Hello, world!!!";

	public void sayHello() {
		System.out.println(this.greeting);
	}
}

設定ファイル(applicationContext.xml)に書かれていること

この設定ファイルには以下のことが記載されている。
1.登場人物は「Greeting」と「Hello」。
  ⇒beanタグのclass属性より。
2.「Greeting」は「Hello」への依存を持っている。
  ⇒propertyタグのrefの値を参照。今回の場合は「hello」で、それはHelloのidの値と一致する。

ざっくり言うと、クラス間の関係がこの設定ファイルに書かれているといえる。

プログラムの流れ

1.クラス間の関係が定義されている設定ファイル(applicationContext.xml)を読み込む。

ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

2.Greetingクラスのオブジェクトを取得する。

Greeting greeting = context.getBean(Greeting.class);

この時点で、Helloに依存を張っているGreetingクラスのオブジェクトが取得される。

3.Greeting #sayHelloを実行する。

greeting.sayHello();

Greeting #sayHello内ではHello #sayHelloが呼ばれ、コンソール上に「Hello, world!!!」が表示される。

で、結局何が嬉しいの?

手続き(処理)と定義(設定)を分離できることだと理解している。

「結局はHello #sayHelloを(間接的に)呼ぶだけだろ?設定ファイルをわざわざ用意して読み込ませなくても、ソースコード上でnewしてメソッド呼べばよくね?」と思われるかもしれない。

しかしソースコード上でオブジェクトを生成して、必要に応じて初期化して、そのオブジェクトを使う…というのはプログラムの本質ではない。

このフレームワークを使うことで、オブジェクトの定義(設定)と手続き(処理)を分離させることができる。

  • オブジェクトの定義(設定)は先述のapplicationContext.xmlに記載されている。
  • そして、その定義にのっとったオブジェクトを取得し、手続き(処理)はJavaソースコード上で行う。

実際、上記コードにnewをしている場所はどこにもない。
newしなくても、applicationContext.xmlに記載されている定義にのっとって、クラス間の依存が解決された(依存が注入された)状態でオブジェクトを使うことができる。

終わりに

本記事では、簡単なサンプルを交えてSpringフレームワークを使った処理の流れおよびSpringフレームワークを使うことによるメリットについて述べた。
(知らないだけでほかにもメリットがあるかもしれない。もしあればご指摘いただければ幸いです。。。)
なお、本記事ではSpringフレームワークの細かいところまでは言及していない。あくまで「雰囲気をつかむ」ことに留めている。
次の記事からは、もう少し踏み込んだところまで言及できればと思う。

参考

第1回 はじめてのSpring Framework | Developers.IO