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に記載されている。
実際、上記コードにnewをしている場所はどこにもない。
newしなくても、applicationContext.xmlに記載されている定義にのっとって、クラス間の依存が解決された(依存が注入された)状態でオブジェクトを使うことができる。
終わりに
本記事では、簡単なサンプルを交えてSpringフレームワークを使った処理の流れおよびSpringフレームワークを使うことによるメリットについて述べた。(知らないだけでほかにもメリットがあるかもしれない。もしあればご指摘いただければ幸いです。。。)
なお、本記事ではSpringフレームワークの細かいところまでは言及していない。あくまで「雰囲気をつかむ」ことに留めている。
次の記事からは、もう少し踏み込んだところまで言及できればと思う。