JavaEE 7をやってみよう。 CDI その1
今回は、DIをやります。
これまでは仕事でSpringを少々いじった程度。
あ、Google guiceも触ったか。
とにかく、機能が似てるのに色々作りやがって。
と思いながら、JavaEEのDI機能、CDIを触ってみる。
package text; public interface IText { public String getText(); public void setText(String text); }
- ・SimpleTextクラス
- 続いて、実装であるテキストクラスを。
インターフェイスの実装クラスには、
スコープ属性のアノテーションを付加します。
これ重要。
これがないとDIできません。
package text.impl; import javax.enterprise.context.RequestScoped; import text.IText; @RequestScoped public class SimpleText implements IText { private String text; @Override public String getText() { return text; } @Override public void setText(String text) { this.text = text; } }
- ・DisplayTextクラス
- 次にこのクラスを利用するクラスを作ります。
ここではManaged Beanとします。
インジェクションするメンバにInjectアノテーションを付加します。
SpringのResourceアノテーションみたいなものです。
JSFからITextインターフェイスのメソッドを呼び出せるように、
IText.getText()を実行するメソッドを作ります。
package manage; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.inject.Named; import text.IText; @Named(value="display") @RequestScoped public class DisplayText { @Inject private IText iText; private String inputText1; /** * inputText1を取得します。 * @return inputText1 */ public String getInputText1() { return inputText1; } /** * inputText1を設定します。 * @param inputText1 inputText1 */ public void setInputText1(String inputText1) { this.inputText1 = inputText1; } public String getText1() { iText.setText(inputText1); return iText.getText(); } }
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets"> <h:head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <h:outputStylesheet library="css" name="default.css" /> <title>DIサンプル</title> </h:head> <h:body> <h:form id="form1"> <h:outputLabel value="文字を入力するのだ。" /><br /> <h:inputSecret id="inputText1" value="#{display.inputText1}"> <f:ajax execute="form1" /> </h:inputSecret> <hr/> <h:outputLabel value="ここに入力した文字がでるぞ。" /> <br /> <h:outputText id="decoText1" value="#{display.text1}" escape="false" /> <hr/> </h:form> </h:body> </html>
実行するとこんな感じで正しくSimpleTextクラスが使われていることがわかります。
てなわけでその2へつづく