2008年12月13日土曜日

Seasar2を使ってみます(3)

次はフィールドインジェクションです。publicフィールドへの自動バインディングとアノテーションを使ったバインディングを試します。

【結論】
自動バインディングは上手くいきましたが、アノテーションはダメでした。なぜだろう??
以下がメモです。
■まず"Binding"アノテーションが存在しない
■Webを調べると"Binding"ではなく標準の"Resource"を使ったほうがよいとのことだったので"javax.annotation.Resource"を使ってみたがダメ。
■@Resource(name="useAnotation")  → ダメ
■@Resource → ダメ
■privateじゃなくprotectedにしてみた → ダメ
■付属のライブラリjarを全部ビルドパスに追加してみた → ダメ
■ダメな理由は結局分からず(なんかすごい恥ずかしいミスをしている予感も)

【作業】
eclipse上でUTF8を入力するために、example2.diconの拡張子をxmlとしています。
(dicon拡張子だとデフォルトエンコーディングのMS932が適用されるらしく、日本語を入力するとSAXExceptionが出るため)

Helloクラス
package test;

import java.util.List;

import javax.annotation.Resource;

public class Hello {

public String autoBinding;

// ↓結局ダメ
@Resource
protected String useAnnotation;

private List<String> listNames;

public List<String> getListNames() {
return listNames;
}

public Hello(List<String> listNames) {
this.listNames = listNames;
}

public void sayHello() {
for (String name: listNames) {
System.out.println("Hello "+name+"! ");
}
System.out.println("Auto binding -> "+autoBinding);
// ↓nullが出るだけです
System.out.println("Annotation binding -> "+useAnnotation);
}

}

Mainクラス
package test;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;

public class Main {
public static void main(String args[]) {
SingletonS2ContainerFactory.setConfigPath("example2.xml");
SingletonS2ContainerFactory.init();
S2Container container = SingletonS2ContainerFactory.getContainer();
Hello hello = (Hello)container.getComponent("hello");
hello.sayHello();
}
}

example2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components24.dtd">
<components>
<component class="java.util.ArrayList" name="list">
<initMethod name="add"><arg>"Hoge"</arg></initMethod>
<initMethod name="add"><arg>"Piyo"</arg></initMethod>
</component>

<component class="java.lang.String" name="autoBinding"/>
<component class="java.lang.String" name="useAnnotation"/>

<component class="test.Hello" name="hello">
<arg>list</arg>
<property name="autoBinding">"自動バインディング"</property>
<!-- ダメだった
<property name="useAnnotation">"アノテーション利用"</property>
-->
</component>
</components>

以上
.

0 件のコメント: