http://thread.main.jp/spring/annotation.html
SpringFrameworkでアノテーション(@Component、@Autowired)を使ってみる
今回は、@Component、@Autowired、@Serviceを使ってみます。
作る手順は前回と同様ですが、設定ファイルの中身やソースを変えます。
まずは動かしてみましょう
pom.xml は前回と同様です。
Spring用の設定ファイル(SpringTest.xml)を以下を追加します。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<bean id="helloWorld" class="spring.test.SpringBean">
<property name="text" value="Hello World!!" />
</bean>
<context:component-scan base-package="spring.test" />
</beans>
component-scan要素は指定場所(パッケージ)のクラスファイルよりアノテーション(@Component、@Autowiredなど)を読み込みます。
読み込みたいパッケージが複数ある場合は、パッケージ数分、component-scan要素を記述します。このページの下の方の例で2つパッケージを読み込んでいます。
設定ファイルは以上です。次はJavaファイルを作成、修正します。
実行対象となるJavaクラス(HelloWorldTest.java)は修正なしです。
package spring.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class HelloWorldTest {
public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext("C:\\workspace\\springApp\\SpringTest.xml");
SpringBean bean = (SpringBean) context.getBean("helloWorld");
bean.show();
}
}
次に設定ファイルよりSpringがデータをセットするBeanクラス(SpringBean.java)ですが、@Autowiredを付けたフィールドを追加します。
package spring.test;
import org.springframework.beans.factory.annotation.Autowired;
public class SpringBean {
private String text;
@Autowired
private SpringComponent component;
public void show() {
System.out.println(text);
component.show();
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
最後に@Componentを持つクラス(SpringComponent.java)を作成します。
package spring.test;
import org.springframework.stereotype.Component;
@Component
public class SpringComponent {
public void show() {
System.out.println("Hello Component!");
}
}
準備は以上で終わりです。それでは実行してみましょう。
作成したファイルに問題がなければ、「Hello World!!」と「Hello Component!」と表示されます。
コンポーネント
前回は設定ファイルでオブジェクト作成を行いましたが、今回はアノテーションでオブジェクトの作成を行いました。
component-scanで指定した場所に @Autowired が見つかった場合、@Componentが付いているクラスのオブジェクト(Springが自動的にオブジェクトを生成してくれます)を探し、@Autowiredのインスタンス変数にセットします。
@Componentは幾つか拡張版が用意されており、同じような動きをします。用途によって使い分けて下さい。
@Component
下の3つのアノテーションのベースとなるもの。
@Repository
DBアクセス関連のクラスはこれにする。DBアクセス時の例外がDataAccessExceptionになる。
@Service
処理をひとまとめにするとき、トランザクションのコミット単位の処理などはこれにする。
@Controller
SpringでWebアプリを作るときにMVCのコントローラはこれにする。
インターフェースの活用
今回の例も活用の仕方が分かり難いですが、Componentクラスをインターフェースにすると活用の仕方がわかります。
SpringComponent.java(クラスからインターフェースに変更)
package spring.test;
public interface SpringComponent {
public void show();
}
SpringComponentの実装クラスを用意します。
SpringComponentImpl1.java
package spring.test1;
import org.springframework.stereotype.Component;
import spring.test.SpringComponent;
@Component
public class SpringComponentImpl1 implements SpringComponent {
public void show() {
System.out.println("One");
}
}
SpringComponentImpl2.java
package spring.test2;
import org.springframework.stereotype.Component;
import spring.test.SpringComponent;
@Component
public class SpringComponentImpl2 implements SpringComponent {
public void show() {
System.out.println("Two");
}
}
上記のように実装クラスが複数存在した場合、どの実装クラスを使用するかは、Spring設定ファイルで決められます。
例えば以下の様に spring.test1 を指定した場合、SpringComponentImpl1が使用されます。
設定ファイル
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<bean id="helloWorld" class="spring.test.SpringBean">
<property name="text" value="Hello World!!" />
</bean>
<context:component-scan base-package="spring.test" />
<context:component-scan base-package="spring.test1" />
</beans>
実行結果
One
設定ファイルの spring.test1 を spring.test2 に変更すると SpringComponentImpl2 が実行されます。
実行結果
Two
このようにどの実装クラスを使用するにも呼び出し元である HelloWorldTestクラス を修正する必要がありせん。
댓글 없음:
댓글 쓰기