Seasar DI Container with AOP

DIContainerExercise

DIContainerの理解度をチェックします。下記の問題に関して当てはまるものを1つ選んでチェックを入れたら、下の「解答へGO」ボタンをクリックしてください。

S2Containerの定義に関する問題

【問題1】

<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
上記のようにSeasar2.1系に対応するDOCTYPEを指定した場合の説明で、 正しくないのは以下のどれでしょうか?

ヒント:S2Containerの定義を参照してください。

1) <initMethod>タグの子タグに<meta>タグが指定できる。
2) <arg>タグの子タグに<meta>タグが指定できる。
3) <component>タグのinstance属性にrequestが指定できる。
4) <component>タグのinstance属性にsessionが指定できる。

S2Containerの生成に関する問題

【問題1】
S2ContainerFactoryクラスを使用してS2Containerを生成する場合、使用するメソッドはどれでしょうか?
ヒント:S2Containerの生成を参照してください。

1) S2ContainerFactory#component(String path)
2) S2ContainerFactory#factory(String path)
3) S2ContainerFactory#container(String path)
4) S2ContainerFactory#create(String path)

【問題2】
examples/container/ccc.diconからS2Containerを生成する場合、S2ContainerFactory#create()メソッド内に 指定する正しいPathの指定方法は以下のどれでしょうか?
ヒント:S2Containerの生成を参照してください。

1) S2ContainerFactory#create("examples/container/ccc.dicon")
2) S2ContainerFactory#create("ccc.dicon")
3) S2ContainerFactory#create("/examples/container/ccc.dicon")
4) S2ContainerFactory#create("examples/container/ccc")

コンポーネントの取得に関する問題

【問題1】
S2Containerに登録されているコンポーネントを取得する場合、使用するメソッドはどれでしょうか?
ヒント:コンポーネントの取得を参照してください。

1) S2Container#getComponentDef(Object componentKey)
2) S2Container#getS2Component(Object componentKey)
3) S2Container#getComponent(Object componentKey)
4) S2Container#getS2Container(Object componentKey)

【問題2】
hello.diconファイルに定義してある<component>タグのname属性が"message"というコンポーネントを取得する場合、 正しい記述は以下のどれでしょうか?

examples/component/hello.dicon

<components>
  <component name="message" class="examples.component.Message"/>
</components>
ヒント:コンポーネントの取得を参照してください。

1) S2Container#getComponent("MESSAGE")
2) S2Container#getComponent("hello.message")
3) S2Container#getComponent("message")
4) S2Container#getComponent("hello.MESSAGE")

【問題3】
message.diconファイルに定義してあるコンポーネントを取得する場合、 正しい記述は以下のどれでしょうか?ただし、MessageImpl.javaはMessage.javaを実装しているものとする。

examples/component/message.dicon

<components>
  <component class="java.util.HashMap"/>
</components>
ヒント:コンポーネントの取得を参照してください。

1) S2Container#getComponent("Map")
2) S2Container#getComponent(Map.class)
3) S2Container#getComponent("examples/component/Map.class")
4) S2Container#getComponent(Map)

【問題4】
examples/component/hello.dicon

<components>
  <component name="aaa" class="java.util.ArrayList"/>
</components>
上記の定義を使用してS2Containerからコンポーネントを取得する場合、 [1]に何を指定したらコンポーネントを取得できず、org.seasar.framework.container.ComponentNotFoundRuntimeException が発生するのはどれでしょうか?

S2Container container = S2ContainerFactory.create("examples/component/hello.dicon");
container.getComponent([1]);
ヒント:コンポーネントの取得を参照してください。

1) List.class
2) "aaa"
3) java.util.List.class
4) "AAA"

【問題5】
examples/component/hello.dicon

<components>
  <component class="examples.component.AaaHelloImpl">
    <arg>"Hello World!"</arg>
  </component>
  <component class="examples.component.BbbHelloImpl">
    <arg>"Hello World!"</arg>
  </component>
</components>
上記のように定義し、コンポーネントクラス名が"examples.component.AaaHelloImpl"の コンポーネントを取得しようとした場合、以下のどの例外が発生しますか?
AaaHelloImplクラスとBbbHelloImplクラスは同じインターフェース(Hello.java)を実装しているものとする。

examples/component/HelloMain.java
S2Container container = S2ContainerFactory.create("examples/component/hello.dicon");
Hello hello = (Hello)container.getComponent(Hello.class);
hello.showMessage();
examples/component/Hello.java
public void showMessage();
ヒント:コンポーネントの取得を参照してください。

1) org.seasar.framework.container.TooManyRegistrationRuntimeException
2) org.seasar.framework.container.ComponentNotFoundException
3) org.seasar.framework.container.TooManyRuntimeException
4) org.seasar.framework.container.ClassUnmatchRuntimeException

【問題6】
examples/exception/message.dicon

<components>
  <component class="examples.exception.MessageImpl"/>
</components>
上記のようにdiconファイルを定義した場合、S2Contanerに登録されているコンポーネントを 取得すると、以下のどの例外が発生するでしょうか? ただし、MessageImpl.javaはMessage.javaを実装しているものとする。

examples/exception/MessageImpl.java
public MessageImpl(Message message) {
    this.message = message;
}
public void showMessage() {
    System.out.println("Hello World!");
}
examples/exception/MainMessage.java
S2Container container = S2ContainerFactory.create("examples/exception/message.dicon");
Message message = (Message)container.getComponent(Message.class);
ヒント:コンポーネントの取得を参照してください。

1) org.seasar.framework.container.CyclicReferenceRuntimeException
2) org.seasar.framework.container.ComponentNotFoundRuntimeException
3) org.seasar.framework.container.TooManyRegistrationRuntimeException
4) org.seasar.framework.container.S2CyclicException

【問題7】

<components>
    <component class="example.container.HelloImpl">
        <initMethod name="setAaa">
            <arg>"hoge"</arg>
        </initMethod>
    </component>
</components>
上記の定義を使用して生成したS2ContainerからHelloImplコンポーネントを取得したところ、org.seasar.framework.container.IllegalMethodRuntimeExceptionが発生してしまいました。 diconファイルを修正する場合、正しい修正内容は、以下のどれでしょうか? HelloImpl#setAaa()は次のとおりです。

public void setAaa(int aaa) {
   _aaa = aaa;
}
ヒント:コンポーネントの取得を参照してください。

1) メソッドインジェクションではなく、セッターインジェクションで定義する。
2) <arg>タグのボディを文字列ではなく数値に変更する。
3) クラスを修正しないとエラーは回避できない。
4) 実行してもエラーは発生しないので修正する必要はない。

【問題8】
root.dicon

<components>
    <include path="sample/container/child.dicon" />
    <include path="sample/container/child2.dicon" />
</components>
上記の定義を使用して生成したS2Containerから存在しないS2Containerを取得しようとした場合、 発生するExceptionは以下のどれでしょうか? 実行するコードは次のとおりです。S2Container#getDescendant()は指定したパスに対応するロード済みのコンテナを取得するメソッドです。

S2Container container = S2ContainerFactory.create("root.dicon");
S2Container childContainer = container.getDescendant("sample/container/child3.dicon");
ヒント:コンポーネントの取得を参照してください。

1) org.seasar.framework.container.ContainerNotRegisteredRuntimeException
2) org.seasar.framework.container.ComponentNotFoundRuntimeException
3) org.seasar.framework.container.ContainerNotFoundRuntimeException
4) 取得できない場合は、nullを返す。

【問題9】
/example/container/hoge.diconからS2Containerを生成する場合、 org.seasar.framework.container.ExtensionNotFoundRuntimeExceptionが発生するのは、以下のどれでしょうか?

ヒント:コンポーネントの取得を参照してください。

1) S2ContainerFactory.create("/example/container/hoge.dicon")
2) S2ContainerFactory.create("/example/container/hoge.xml")
3) S2ContainerFactory.create("/example/container/hoge")
4) S2ContainerFactory.create("hoge.dicon")

コンストラクタ・インジェクションに関する問題

【問題1】
コンストラクタ・インジェクションを用いて、examples.dicon.HelloConstructorInjectionクラスの コンストラクタの引数に文字列"Hello"を設定する場合、以下の定義で[1]に入るタグはどれでしょうか? ただし、S2Containerに他のコンポーネントは登録されていないものとする。

examples/dicon/hello.dicon

<components>
  <component name="hello" class="examples.dicon.HelloConstructorInjection">
    [1]
  </component>
</components>
ヒント:コンストラクタ・インジェクションを参照してください。

1) <arg>"Hello"</arg>
2) <arg>Hello</arg>
3) <args>"Hello"</args>
4) <args>Hello</args>

セッター・インジェクションに関する問題

【問題1】
セッター・インジェクションを用いて、examples.dicon.MessageSetterInjectionクラスの セッター・メソッド(setMessage)の引数に文字列"Test"を設定する場合、 以下の定義で[1]に入るタグはどれでしょうか?

examples/dicon/hello.dicon

<components>
  <component name="message" class="examples.dicon.MessageSetterInjection">
      [1]
  </component>
</components>
ヒント:セッター・インジェクションを参照してください。

1) <property>"Test"</property>
2) <property name="message">"Test"</property>
3) <arg name="message">"Test"</arg>
4) <message>"Test"</message>

メソッド・インジェクションに関する問題

【問題1】
メソッド・インジェクションを用いて、java.util.DateクラスのsetTimeメソッドに0を設定する場合、以下の定義で[1]に入るタグはどれでしょうか?

<component class="java.util.Date">
    [1]
</component>
ヒント:メソッド・インジェクションを参照してください。

1)
    <property name="setTime">
       0
    </property>
2)
    <arg>
      0
    </arg>
3)
    <initMethod name="setTime">
      0
    </initMethod>
4)
    <initMethod name="setTime">
      <arg>
          0
      </arg>
    </initMethod>

自動バインディングに関する問題

【問題1】
<component>タグのautoBinding属性を省略した場合、autoBinding属性には何が設定されるでしょうか?
ヒント:自動バインディングを参照してください。

1) constructor
2) property
3) auto
4) none

【問題2】
<component>タグのautoBinding属性を指定して自動バインディングができないように設定するには、 <component>タグのautoBinding属性に何を指定するでしょうか?

ヒント:自動バインディングを参照してください。

1) auto
2) none
3) constructor
4) property

【問題3】
コンポーネント名がmapのコンポーネントに定義されている値をMessageImplクラスのコンストラクタに自動バインディングしたい場合、 以下の定義の[1]に何を入れるでしょうか?

examples/auto/message.dicon

<components>
  <component name="map" class="java.util.HashMap">
    <initMethod name="put">
      <arg>"aaa"</arg>
      <arg>111</arg>
    </initMethod>
  </component>
  <component [1] class="examples.auto.MessageImpl"/>
</components>
examples/auto/MessageImpl.java
public MessageImpl(Map message){
    this.message = message;
}
ヒント:自動バインディングを参照してください。

1) autoBinding="constructor"
2) autoBinding="none"
3) autoBinding="property"
4) autoBinding="MessageImpl"

【問題4】
examples/auto/message.dicon

<components>
  <component class="java.util.HashMap">
     <initMethod name="put">
      <arg>"aaa"</arg>
      <arg>111</arg>
    </initMethod>
  </component>
  <component autoBinding="constructor" class="examples.auto.Message"/>
</components>
上記の定義のようにautoBinding属性にconstructorが設定されていた場合、examples/auto/Messageクラスのコンストラクタの設定で 自動バインディングできるようにするためには、[1]に何を入れたら良いでしょうか?

examples/auto/Message.java
public Message([1] message){
    this.message = message;
 }
ヒント:自動バインディングを参照してください。

1) HashMap
2) Map
3) TreeMap
4) AbstractMap

【問題5】
examples/auto/HelloImpl.dicon

<components>
  <component class="examples.auto.MessageImpl">
    <initMethod name="setMessage">
      <arg>"Hello World!"</arg>
    </initMethod>
  </component>
  <component autoBinding="constructor" class="examples.auto.HelloImpl"/>
</components>
上記のようなdiconファイルが定義されていた場合、下のように複数のコンストラクタを定義すると examples.auto.HelloImplクラスのどのコンストラクタが使用されるでしょうか? ただし、MessgeImpl.javaはMessage.javaを実装しているものとする。

examples/auto/HelloImpl.java
public HelloImpl(){
    System.out.println("Hello");
}

public HelloImpl(Message message) {
    System.out.println("Hello");
}

public HelloImpl(Message message1, Message message2){
    System.out.println("Hello");
}
examples/auto/Message.java
public void setMessage();
public void showMessage();
examples/auto/MessageImpl.java
public void setMessage(StringBuffer message){
    message_.append(message);
}
public void showMessage(){
    System.out.println(message_);
}
ヒント:自動バインディングを参照してください。

1) HelloImpl()
2) HelloImpl(Message message)
3) HelloImpl(Message message1, Message message2)
4) コンストラクタは呼ばれない

【問題6】
examples/auto/message.dicon

<components>
  <component class="java.util.ArrayList">
    <initMethod name="add">
      <arg>"testMessage"</arg>
    </initMethod>
  </component>
  <component autoBinding="constructor" class="examples.auto.MessageImpl"/>
</components>
上記のようなdiconファイルが定義されていた場合、下のように複数のコンストラクタを定義すると examples.auto.MessageImplクラスのどのコンストラクタが使用されるでしょうか?

examples/auto/MessageImpl.java
public MessageImpl(List list) {
    this.list = list;
}

public MessageImpl(List list1, List list2){
    this.list1 = list1;
    this.list2 = list2;
}

public MessageImpl(List list1, List list2, String message){
    this.list1 = list1;
    this.list2 = list2;
    this.message = message;
}

private MessageImpl(List list1, List list2, List list3){
    this.list1 = list1;
    this.list2 = list2;
    this.list3 = list3;
}
ヒント:自動バインディングを参照してください。

1) MessageImpl(List list)
2) MessageImpl(List list1, List list2)
3) MessageImpl(List list1, List list2, String message)
4) MessageImpl(List list1, List list2, List list3)

【問題7】
以下のようにdiconファイルを定義し、実装クラスMessageImplのセッターメソッドに自動バインディングする場合、examples/auto/MessageImpl.javaのセッターメソッドで間違った定義をしているのはどれでしょうか?

examples/auto/message.dicon

<components>
    <component class="java.util.Hash">
      <initMethod name="put">
        <arg>"test"</arg>
        <arg>"MessageTest"</arg>
      </initMethod>
    </component>
    <component autoBinding="property" class ="examples.auto.MessageImpl"/>
</components>
ヒント:自動バインディングを参照してください。

1)
public void setMessage(Map map) {
    this.map = map;
}
2)
public void setAaa(Map map) {
    this.map = map;
}
3)
public void messageSet(Map map) {
    this.map = map;
}
4)
public void setBbb(Map map) {
    this.map = map;
}

【問題8】
hello.diconで定義しているコンポーネントの値を自動バインディングできるように実装クラスHelloImplのセッターメソッドを正しく定義しているのはどれでしょうか?

examples/auto/hello.dicon

<components>
    <component class="java.util.ArrayList">
      <initMethod name="add">
        <arg>"Hello!"</arg>
      </initMethod>
    </component>
    <component autoBinding="property" name="message" class ="examples.auto.HelloImpl"/>
</components>
ヒント:自動バインディングを参照してください。

1)
public void setHelloMessage(LinkedList list) {
    this.list = list;
}
2)
public void setHelloMessage(ArrayList list) {
    this.list = list;
}
3)
public void setHelloMessage(String message) {
    this.message = message;
}
4)
public void setHelloMessage(List list) {
    this.list = list;
}

【問題9】
以下のように定義した場合、実装クラスMessageImplのどのセッターメソッドが呼ばれるでしょうか? ただし、HelloImpl.javaはHello.javaを実装しているものとする。

examples/auto/message.dicon

<components>
  <component class="examples.auto.HelloImpl">
    <initMethod name="addHelloMessage">
      <arg>"Hello"</arg>
    </initMethod>
  </component>
  <component autoBinding="property" class="examples.auto.MessageImpl"/>
</components>
examples/auto/MessageImpl.java
public void setMessage(){
    System.out.println("Hello!");
}

public void setMessage(Hello hello){
    this.hello = hello;
}

public void setMessage(Hello hello, Hello hello2){
    this.hello = hello;
    this.hello2 = hello2;
}

public void setMessage(Hello hello, Hello hello2, Hello hello3){
    this.hello = hello;
    this.hello2 = hello2;
    this.hello3 = hello3;
}
examples/auto/Hello.java
public void showHelloMessage();
examples/auto/HelloImpl.java
public void addHelloMessage(StringBuffer hello){
    hello_.append(hello);
}

public void showHelloMessage(){
    System.out.println(hello_);
}
ヒント:自動バインディングを参照してください。

1) setMessage()
2) setMessage(Hello hello)
3) setMessage(Hello hello, Hello hello2)
4) setMessage(Hello hello, Hello hello2, Hello hello3)

【問題10】
examples/exception/message.dicon

<components>
  <component name="map" class="java.util.HashMap">
    <initMethod name="put">
      <arg>"hello"</arg>
      <arg>"Hello World!"</arg>
    </initMethod>
  </component>
  <component autoBinding="auto" name="message" class="examples.exception.MessageImpl"/>
</components>
上記のように<component>タグのautoBinding属性をautoに指定した場合、MessageMainクラスを実行すると自動バインディングされるのはどのメソッドでしょうか?
また、MessageImpl.javaはMessage.javaを実装しているものとする。

examples/exception/MessageImpl.java
public MessageImpl(Map map) {
    this.map = map;
}
public void setMessage(Map map) {
    this.map = map;
}
examples/exception/MessageMain.java
S2Container container = S2ContainerFactory.create("examples/exception/message.dicon");
Message message = (Message)container.getComponent(Message.class);
ヒント:自動バインディングを参照してください。

1) コンストラクタ(MessageImpl(Map map))
2) セッターメソッド(setMessage(Map map))
3) コンストラクタ(MessageImpl(Map map))とセッターメソッド(setMessage(Map map))
4) コンストラクタ(MessageImpl(Map map))とセッターメソッド(setMessage(Map map))に自動バインディングされない

S2Container定義の分割とインクルードに関する問題

【問題1】
以下のように定義されていた場合、コンポーネントの検索順序として 正しいのはどれでしょうか?

examples/include/foo.dicon

<components>
  <include path="aaa.dicon"/>
  <include path="bbb.dicon"/>
  <component class="examples.include.Foo" />
</components>
ヒント:S2Container定義の分割とインクルードを参照してください。

1) aaa.diconのコンポーネント→bbb.diconのコンポーネント→自分自身のコンポーネントの順
2) 自分自身のコンポーネント→aaa.diconのコンポーネント→bbb.diconのコンポーネントの順
3) 自分自身のコンポーネント→bbb.diconのコンポーネント→aaa.diconのコンポーネントの順
4) bbb.diconのコンポーネント→aaa.diconのコンポーネント→自分自身のコンポーネントの順

【問題2】
以下のように定義し、Mainクラスを実行すると何が表示されるでしょうか?

examples/include/app.dicon

<components>
  <include path="examples/include/aaa.dicon"/>
  <include path="examples/include/bbb.dicon"/>
  <component name="root" class="examples.include.HelloImpl"/>
</components>
examples/include/aaa.dicon
<components>
  <component class="java.util.HashMap">
    <initMethod name="put">
      <arg>"hello"</arg>
      <arg>"Hello Aaa!"</arg>
    </initMethod>
  </component>
  <component name="aaa" class="examples.include.HelloImpl"/>
</components>
examples/include/bbb.dicon
<components>
  <component class="org.seasar.framework.util.ArrayMap">
    <initMethod name="put">
      <arg>"hello"</arg>
      <arg>"Hello Bbb!"</arg>
    </initMethod>
  </component>
  <component name="bbb" class="examples.include.HelloImpl"/>
</components>
examples/include/HelloImpl.java
public void HelloImpl(Map hello) {
    hello_ = hello;
}

public void showMessage() {
    System.out.println(hello_.get("hello"));
}
examples/include/Main.java
S2Container container = S2ContainerFactory.create("examples/include/app.dicon");
Hello hello = (Hello)container.getComponent("root");
hello.showMessage();
ヒント:S2Container定義の分割とインクルードを参照してください。

1) Hello Aaa!
2) Hello Bbb!
3) Hello Aaa! Hello Bbb!
4) 何も表示されない

【問題3】
問題2の定義を使用し、Mainクラスでコンポーネント名がbbbというコンポーネントを取得した場合は何が表示されるでしょうか?

examples/include/Main.java

S2Container container = S2ContainerFactory.create("examples/include/app.dicon");
Hello hello = (Hello)container.getComponent("bbb");
hello.showMessage();
ヒント:S2Container定義の分割とインクルードを参照してください。

1) Hello Aaa!
2) Hello Bbb!
3) Hello Aaa! Hello Bbb!
4) 何も表示されない

名前空間に関する問題

【問題1】
child.diconで登録したコンポーネントをAaaHellomplにセットする場合、[1]には以下のどれが入るでしょうか?

examples/division/root.dicon

<components namespace="root">
  <include path="examples/division/child.dicon"/>
  <component name="aaa" class="examples.division.AaaHelloImpl">
    <arg>[1]</arg>
  </component>
  <component name="bbb" class="java.lang.String">
    <arg>"World!"</arg>
  </component>
</components>
examples/division/child.dicon
<components namespace="child">
  <component name="bbb" class="java.lang.String">
    <arg>"Hello"</arg>
  </component>
</components>
examles/division/AaaHelloImpl.java
public AaaHelloImpl(String message) {
    this.message = message;
}
public void showMessage() {
    System.out.println(message);
}
ヒント:名前空間を参照してください。

1) bbb
2) child.bbb
3) root.bbb
4) "child.bbb"

インスタンス管理に関する問題

【問題1】
<component>タグのinstance属性を省略した場合、instance属性には何が設定されるでしょうか?
ヒント:インスタンス管理を参照してください。

1) なにも設定されない
2) singleton
3) prototype
4) outer

【問題2】
examples/instance/message.dicon

<components>
  <component name="message" class="java.util.HashMap">
    <initMethod name="put">
      <arg>"hello"</arg>
      <arg>"hoge"</arg>
    </initMethod>
  </component>
</components>
上記のように<component>タグにinstance属性を定義しない場合で、下のMessageMain.javaのように 一度コンテナから取得したMapに値をセットし、再度コンテナからMapを取得している場合、 コンソールには何が表示されるでしょうか?

examples/instance/MessageMain.java
S2Container container = S2ContainerFactory.create("examples/instance/message.dicon");
Map map = (Map)container.getComponent(Map.class);
map.put("hello", "world!");
Map map2 = (Map)container.getComponent(Map.class);
System.out.println(map.get("hello"));
ヒント:インスタンス管理を参照してください。

1) hoge
2) world!
3) null
4) hello

【問題3】
セッション毎に1つのインスタンスを作成したい場合、<component>タグのinstance属性に何を指定するでしょうか?

ヒント:インスタンス管理を参照してください。

1) "singleton"
2) "session"
3) "prototype"
4) "default"

【問題4】
リクエスト毎に1つのインスタンスを作成したい場合、<component>タグのinstance属性に何を指定するでしょうか?

ヒント:インスタンス管理を参照してください。

1) "session"
2) "request"
3) "auto"
4) "Request"

【問題5】
S2Container外で作成したコンポーネントのインスタンスを取得し、 Dependency Injectionする場合、以下の[1]に入る正しい答えはどれでしょうか?

examples/instance/HelloWorld.java

public static void main(String[] args) {
    S2Container container = S2ContainerFactory.create("examples/instance/hello.dicon");
    Message message = new Message();
        [1]
    message.showMessage();
}
examples/instance/hello.dicon
<components>
  <component instance="outer" class="examples.instance.HelloImpl">
  <property name="message">
      "Hello World!"
    </property>
   </component>
</components>
examples/instance/Message.java
public void setMessage(String message){
    this.message = message;
}
public void showMessage(){
    System.out.println(message);
}
ヒント:インスタンス管理を参照してください。

1) container.injectDependency(message);
2) container.register(message)
3) container.getComponent("message")
4) ontainer.dependencyInjection(message);

【問題6】
以下のように定義し、外部コンポーネントに値を設定する場合、helloMainクラスを実行すると以下のどのメッセージが表示されるでしょうか?

example/include/hello.dicon
<components namespace="aaa">
  <component name="map" instance="outer" class="java.util.HashMap">
    <initMethod name="put">
      <arg>"hello"</arg>
      <arg>"Hello World!"</arg>
    </initMethod>
  </component>
</components>
example/include/helloMain.java
S2Container container = S2ContainerFactory.create("example/include/hello.dicon");
Map hashMap = new HashMap();
container.injectDependency(hashMap, HashMap.class);
System.out.println(hashMap.get("hello"));
ヒント:インスタンス管理を参照してください。

1) "Hello World!"
2) "hello"
3) "hello world!"
4) null

【問題7】
example/include/array.dicon

<components>
    <component name="array" instance="outer" class="org.seasar.framework.util.ArrayMap">
        <initMethod name="put">
            <arg>"hoge"</arg>
            <arg>"foo"</arg>
        </initMethod>
    </component>
</components>
上記の定義を使用して生成したS2Containerで、異なるクラス(Class#isInstance()がfalse)を使用してS2Container#injectDependency()を呼び出した場合、 発生するExceptionは以下のどれでしょうか? 実行するコードは次のとおりです。

S2Container container = S2ContainerFactory.create("example/include/array.dicon");
Map hashMap = new HashMap();
container.injectDependency(hashMap, "array");
ヒント:インスタンス管理を参照してください。

1) org.seasar.framework.container.ClassUnmatchRuntimeException
2) org.seasar.framework.container.ComponentNotFoundRuntimeException
3) org.seasar.framework.container.ClassMismatchRuntimeException
4) 発生しない

ライフサイクルに関する問題

【問題1】
S2Containerの開始時にmapコンポーネントのHashMap(keyが"aaa")に111を設定し、S2Containerの終了時にmapコンポーネントのHashMap(keyが"aaa")にnullをセットしたい場合、[1]と[2]には入る正しい組み合わせはどれでしょうか?

examples/lifecycle/aaa.dicon
<components namespace="bar">
  <component name="map" class="java.util.HashMap">
    <[1] name="put">
      <arg>"aaa"</arg>
      <arg>111</arg>
    </[1]>
    <[2] name = "put">
      <arg>"aaa"</arg>
      <arg>null</arg>
    </[2]>
  </component>
</components>
ヒント:ライフサイクルを参照してください。

1) [1] initMethod [2] destroyMethod
2) [1] destroyMethod [2] initMethod
3) [1] init [2] destroy
4) [1] initMethod [2] destroy

【問題2】
exmples/lifecycle/hello.dicon

<components>
  <component name="map" class="java.util.HashMap">
    <initMethod name="put">
      <arg>"hello"</arg>
      <arg>"Hello World!"</arg>
    </initMethod>
    <destroyMethod name="put">
      <arg>"hello"</arg>
      <arg>null</arg>
    </destroyMethod>
  </component>
  <component name="list" class="java.util.ArrayList">
    <initMethod name="add">
      <arg>"Hello "</arg>
    </initMethod>
    <destroyMethod name="clear"/>
  </component>
  <component name="message" class="examples.lifecycle.MessageImpl"/>
</components>
上記のようにdiconファイルを定義し、コンポーネントの初期化がmapコンポーネント、listコンポーネントの順で行われた場合、S2Container#destroy()を実行すると終了処理はどのように行われるでしょうか?

examples/lifecycle/HelloMain.java
S2Container container = S2ContainerFactory.create("examples/lifecycle/hello.dicon");
Message message = (Message)container.getComponent(Message.class);
container.destroy();
examples/lifecycle/MessgeImpl.java
public MessageImpl(Map map, List list) {
    this.map = map;
    this.list = list;
}
ヒント:ライフサイクルを参照してください。

1) mapコンポーネント、listコンポーネントの順で終了処理が行われる
2) listコンポーネント、mapコンポーネントの順で終了処理が行われる
3) mapコンポーネントだけ終了処理が行われる
4) 終了処理は行われない

【問題3】
example/lifecycle/hello.dicon

<components namespace="bar">
  <component name="map" instance="prototype" class="java.util.HashMap">
    <initMethod name="put">
      <arg>"aaa"</arg>
      <arg>"Hello World!"</arg>
    </initMethod>
    <destroyMethod name="put">
      <arg>"aaa"</arg>
      <arg>null</arg>
    </destroyMethod>
  </component>
</components>
上記のdiconファイルのように、<component>タグのinstance属性に"prototype"を指定した場合、HelloMain.javaを実行すると何が表示されるでしょうか?

example/lifecycle/HelloMain.java
S2Container container = S2ContainerFactory.create(PATH);
Map map = (Map)container.getComponent("map");
container.destroy();
System.out.println(map.get("aaa"));
ヒント:ライフサイクルを参照してください。

1) "Hello World!"
2) null
3) "aaa"
4) 空白

コンポーネントでS2Containerを利用するに関する問題

【問題1】
S2Containerは何という名前で登録されているでしょうか?

ヒント:コンポーネントでS2Containerを利用するを参照してください。

1) S2Container
2) container
3) S2Component
4) component

【問題2】
BarImpl.javaでS2Containerのインスタンスを取得したい場合、[1]には何が入るでしょうか?

examples/s2container/bar.dicon
<component class="examples.s2container.BarImpl">
  [1]
</component>
examples/s2container/BarImpl.java
public BarImpl(S2Container container) {
    this.containere = container;
}
ヒント:コンポーネントでS2Containerを利用するを参照してください。

1) S2Container
2) container
3) component
4) 何も書く必要がない

S2ContainerServletに関する問題

【問題1】
SingletonS2ContainerFactory#initで生成したS2Containerを取得するには、SingletonS2ContainerFactoryクラスのどのメソッドを使用するでしょうか?
ヒント:S2ContainerServletを参照してください。

1) getServletContext()
2) getConfigPath()
3) getS2Container()
4) getContainer()

【問題2】
S2ContainerServletについての記述で正しくない説明はどれでしょうか?

ヒント:S2ContainerServletを参照してください。

1) S2ContainerServletが起動した後、S2Containerのインスタンスを取得するメソッドは
    SingletonS2ContainerFactory#getContainer()
2) S2Containerのライフサイクルは、S2ContainerServletと連動する
3) 他のサーブレットよりも遅く開始されるようにweb.xmlの<load-on-startup>タグを
    調整する
4) web.xmlのdebugパラメータをtrueにするとS2Containerを再起動することができる

【問題3】

<servlet>
  <servlet-name>s2servlet</servlet-name>
  <servlet-class>org.seasar.framework.container.servlet.S2ContainerServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
  <init-param>
    <param-name>configPath</param-name>
    <param-value>app.dicon</param-value>
  </init-param>
  <init-param>
    <param-name>debug</param-name>
    <param-value>false</param-value>
  </init-param>
</servlet>
S2ContainerServletを使うために、上記のようにweb.xmlが記述されており、Webアプリケーションを稼動中にS2Containerを再起動する場合、アクセスするURLで以下の[1]に入る文字はどれでしょうか? xxxはWebアプリケーションのコンテキスト名です。

http://localhost:8080/xxx/s2servlet?[1]

ヒント:S2ContainerServletを参照してください。

1) s2=reset
2) container=read
3) command=restart
4) seasar2=reroad

app.diconの役割に関する問題

【問題1】
次の文の[]にあてはまる言葉で正しい組み合わせはどれでしょうか?

すべてのS2Container定義のルートになる定義ファイルは、慣例で[1]という名前にします。 [1]には[2]の定義はしないようにしてください。

ヒント:app.diconの役割を参照してください。

1) [1] app.dicon [2] コンポーネント
2) [1] seasar.dicon [2] セッター・インジェクション
3) [1] s2.dicon [2] <include>タグ
4) [1] dao.dicon [2] S2Container

メタデータに関する問題

【問題1】
example/meta/message.dicon

<components>
  <meta>"hello"</meta>
  <meta>"world"</meta>
  <meta>"message"</meta>
</components>
上記のようにdiconファイルにメタデータを定義した場合、以下のMessageクラスを実行すると何が表示されるでしょうか?

example/meta/Message.java
S2Container container = S2ContainerFactory.create("example/meta/message.dicon");
MetaDef meta = container.getMetaDef(2);
System.out.println(meta.getValue());
ヒント:メタデータを参照してください。

1) "hello"
2) "world"
3) "message"
4) "hello world"

【問題2】
example/meta/hello.dicon

<components>
  <meta name="hello world">"Hello World!"</meta>
  <meta name="world">"world"</meta>
  <meta name="hello" >"hello"</meta>
</components>
上記のようにdiconファイルにメタデータを定義し、<meta>タグのname属性が"hello world"の値を取得したい場合、以下のMessageMainクラスの[1]に入るS2Container#getMetaDefの引数はどれでしょうか?

example/meta/MessageMain.java
S2Container container = S2ContainerFactory.create("example/meta/hello.dicon");
MetaDef meta = container.getMetaDef([1]);
ヒント:メタデータを参照してください。

1) "hello world"
2) "world"
3) "hello"
4) "Hello World!"

【問題3】
example/meta/hello.dicon

<components>
  <meta name="hello">"Hello"</meta>
  <meta name="hello">"World!"</meta>
  <meta>"hello"</meta>
</components>
上記のようにdiconファイルを定義し、以下のMessageMainクラスを実行した場合、出力される文字列は以下のどれでしょうか?

example/meta/MessageMain.java
S2Container container = S2ContainerFactory.create("example/meta/hello.dicon");
MetaDef[] meta = container.getMetaDefs("hello");
for(int i=0; i<meta.length; i++){
    System.out.println(meta[i].getValue());
}
ヒント:メタデータを参照してください。

1) Hello
    World!
2) Hello
3) World!
4) hello

OGNL式に関する問題

【問題1】

<component class="java.lang.String">
  <arg>[1]</arg>
</component>
上記のようなStringのコンポーネントに文字列"hoge"をセットしたい場合、[1]に入る記述は以下のうちどれでしょうか?
ヒント:OGNL式を参照してください。

1) hoge
2) "hoge"
3) \hoge\
4) $hoge

【問題2】

public class SampleChar {
    public setSampleChar(char a) {
        :
    }
}
上記のようなchar型を引数に持つセッターメソッドに、diconファイルで文字"A"をセットする場合、以下のdiconファイルで[1]に入る文字はどれでしょうか?
<component class="test.java.sample.SampleChar">
  <property name="sampleChar">[1]</property>
</component>
ヒント:OGNL式を参照してください。

1) 'A'
2) "A"
3) A
4) @A

【問題3】

public class SampleBoolean {
    public SampleBoolean(boolean isA) {
        :
    }
}
上記のようなboolean型を引数に持つコンストラクタに、diconファイルでtrueをセットする場合、以下のdiconファイルで[1]に入る文字はどれでしょうか?
<component class="test.java.sample.SampleBooleam">
  <arg>[1]</arg>
</component>
ヒント:OGNL式を参照してください。

1) "true"
2) 'true'
3) true
4) 1

【問題4】

public class SampleConst {
    public SampleConst(String message) {
        :
    }
}
以下のdiconファイルの[1]に値を入れた場合、上記のようなStringクラスを引数に持つコンストラクタに、文字列"foo"をセットできないのは以下のどれでしょうか?
<component name="message">
  [1]
</component>
<component class="example.ogin.SampleConst">
  <arg>message</arg>
</component>
ヒント:OGNL式を参照してください。

1) "foo"
2) new java.lang.String("foo")
3) java.lang.String("foo")
4) new String("foo")

【問題5】
以下のdiconファイルで、java.lang.Math#max(int a,int b)のstaticなメソッドを呼び出した結果を参照する場合、[1]に入る記述で正しいのどれでしょうか?

<component name="max">
    [1]
</component>
ヒント:OGNL式を参照してください。

1) java.lang.Math@max(1, 2)
2) @Math@max(1,2)
3) @java.lang.Math.max(1, 2)
4) @java.lang.Math@max(1, 2)

【問題6】
OGNL式の記述で間違っている項目は、どれでしょうか?
ヒント:OGNL式を参照してください。

1) <arg>@java.util.List@class</arg>
2) <arg>2</arg>
3) <arg>@class@java.util.List</arg>
4) <arg>"@class@java.util.List"</arg>

【問題7】

public class FooMessage {
    public String getMessage() {
        return "foo";
    }
}
上記のFooMessage#getMessage()をdiconファイルで使用する場合、以下のdiconファイルで[1]に入るのはどれでしょうか?
<component name="foo" class="test.java.sample.FooMessage"/>
<component name="message">
    [1]
</component>
ヒント:OGNL式を参照してください。

1) getMessage()
2) FooMessage.getMessage()
3) foo.getMessage()
4) "foo".getMessage()

【問題8】
java.util.HashMap#put()にメソッドインジェクションで値を設定する場合、以下の[1]に入る正しい項目はどれでしょうか?

examples/ognl/hello.dicon
<components>
  <component name="map" class="java.util.HashMap">
    <initMethod>[1]</initMethod>
  </component>
</components>
ヒント:OGNL式を参照してください。

1) #self("hello", "Hello World!")
2) #put.self("hello", "Hello World!")
3) #self.put("hello", "Hello World!")
4) #self("hello", "Hello World!").put

【問題9】
<initMethod>タグが呼ばれたときにコンソールに文字列"Hello"を表示したい場合、[1]には何が入るでしょうか?

example/ognl/hello.dicon
<components>
  <component name="map" class="java.util.HashMap">
    <initMethod>[1]("Hello")</initMethod>
  </component>
</components>
ヒント:OGNL式を参照してください。

1) #out.println
2) #out
3) #print
4) #system.out

【問題10】
<initMethod>タグが呼ばれたときにコンソールにエラーメッセージを表示したい場合、[1]には何が入るでしょうか?

example/ognl/hello.dicon
<components>
  <component name="list" clas="java.util.ArrayList">
    <initMethod>[1]("error")</initMethod>
  </component>
</components>
ヒント:OGNL式を参照してください。

1) #err
2) #err.println
3) #error.println
4) #system.err

【問題11】
<initMethod>タグ内で有効でないオブジェクトは以下のどれでしょうか?

ヒント:OGNL式を参照してください。

1) #self
2) #out
3) #err
4) #system