[Seasar-user:21172] Re: 自動バインディングの適用範囲について

Shouta Morimoto [E-MAIL ADDRESS DELETED]
2011年 11月 23日 (水) 11:31:35 JST


小林様

お世話になります、森本です。


下記ご指摘ありがとうございます。
「Seasar 2 徹底入門」の2章を改めて読み直したところ
おっしゃっている意味が理解できました。

Testクラスをapp.diconに定義し、インスタンス化を
newではなくgetComponentで実施するようにしたところ
期待した通りの動作を確認できました。

以上、よろしくお願いいたします。

(2011/11/22 2:34), Koichi Kobayashi wrote:
> 小林 (koichik) です.
> 
> 自動登録されず,dicon に定義もされていないクラスは
> 基本的に Seasar2 で扱われませんから,DI もされません.
> そもそも Test のインスタンスはどのように取得してますか?
> S2Container#getComponent() では取得できないはずですが.
> もし自分で new しているなら,DI コンテナについて基本的な
> 理解が出来てないということなので,「Seasar 2 徹底入門」
> などを一読することをおすすめします.
> 
> 
> 
> On Tue, 22 Nov 2011 01:30:05 +0900, Shouta Morimoto<[E-MAIL ADDRESS DELETED]>  wrote:
> 
>> 小林様
>>
>> 森本です。
>>
>>
>>> Test クラスは自動登録ではないと思いますが,dicon に
>>> 記述していますか? それは app.dicon ですか?
>>
>> Testクラスは<rootパッケージ名>.util.portalパッケージに所属するため
>> 自動登録ではないと認識しております。
>> またdiconには全く記述しておりません。
>> diconしていないクラスのプロパティにはコンポーネントはDIされない
>> のでしょうか?
>>
>>
>>> SMART deploy による自動登録は通常 app.dicon をインクルード
>>> しているルートのコンテナに対して行われます.
>>
>> 勉強不足で申し訳ありません。
>> 「app.diconをインクルードしているルートのコンテナ」が何を
>> 指しているのかがいまいち理解できていません。
>> あるいはこちらからどのような情報をお出しすれば本件に当てはまっているか
>> ご判断できますでしょうか?
>>
>>> そのため,app.dicon からインクルードされる別の dicon に
>>> Test クラスを定義した場合,そのコンテナ (dicon) からは
>>> 自動登録されたコンポーネントは見えません.
>>
>> そもそもどのdiconに登録していなかったので上記は関係ないですかね…。
>> 取り急ぎapp.diconにTest.javaを登録してはみましたが、
>> 状況に変わりはありませんでした。
>>
>>
>>> S2Unit を使った場合,通常は自動登録されるルートのコンテナに
>>> app.dicon がインクルードされるため,Test をapp.dicon に
>>> 定義してもそのコンテナ (app.dicon) からは自動登録された
>>> コンポーネントは見えません.
>>> その場合は getRootDicon() をオーバーライドする必要があります.
>>>
>>> public String getRootDicon() {
>>>    return "app.dicon";
>>> }
>>>
>>> S2Unit4 の場合はアノテーションで指定することができます.
>>>
>>> http://s2container.seasar.org/2.4/ja/S2JUnit4.html#rootDiconAnnotation
>>
>> 取り急ぎ現在はS2Unit、S2Unit4は利用していません。
>>
>>
>> 以上、恐れ入りますがご確認のほどよろしくお願いいたします。
>>
>> (2011/11/21 1:10), Koichi Kobayashi wrote:
>>> 小林 (koichik) です.
>>>
>>> Test クラスは自動登録ではないと思いますが,dicon に
>>> 記述していますか? それは app.dicon ですか?
>>>
>>> SMART deploy による自動登録は通常 app.dicon をインクルード
>>> しているルートのコンテナに対して行われます.
>>> そのため,app.dicon からインクルードされる別の dicon に
>>> Test クラスを定義した場合,そのコンテナ (dicon) からは
>>> 自動登録されたコンポーネントは見えません.
>>>
>>> S2Unit を使った場合,通常は自動登録されるルートのコンテナに
>>> app.dicon がインクルードされるため,Test をapp.dicon に
>>> 定義してもそのコンテナ (app.dicon) からは自動登録された
>>> コンポーネントは見えません.
>>> その場合は getRootDicon() をオーバーライドする必要があります.
>>>
>>> public String getRootDicon() {
>>>     return "app.dicon";
>>> }
>>>
>>> S2Unit4 の場合はアノテーションで指定することができます.
>>>
>>> http://s2container.seasar.org/2.4/ja/S2JUnit4.html#rootDiconAnnotation
>>>
>>>
>>> On Mon, 21 Nov 2011 00:01:54 +0900, Shouta Morimoto<[E-MAIL ADDRESS DELETED]>   wrote:
>>>
>>>> 森本と申します。
>>>> 件名の件について質問させてください。
>>>>
>>>> SAStrutsにて作成しているWebアプリケーションにおいて、
>>>> 自動バインディングが思ったように動いておりません。
>>>>
>>>> 具体的には<rootパッケージ名>.serviceパッケージ内の
>>>> CompetitionUserService.javaを
>>>> <rootパッケージ名>.util.portalパッケージ内の
>>>> Test.java内のプロパティにDIしたいと思っています。
>>>>
>>>> ■--------状況説明ここから--------■
>>>>
>>>> CompetitionUserService.javaの内容は以下の通りです。
>>>> ---------------------------------------------------------
>>>> package<rootパッケージ名>.service;
>>>>
>>>> import java.util.List;
>>>> import javax.annotation.Generated;
>>>> import javax.persistence.EntityExistsException;
>>>>
>>>> import<rootパッケージ名>.entity.CompetitionUser;
>>>>
>>>> import static org.seasar.extension.jdbc.operation.Operations.*;
>>>> import static<rootパッケージ名>.entity.CompetitionUserNames.*;
>>>>
>>>> /**
>>>>    * {@link CompetitionUser}のサービスクラスです。
>>>>    *
>>>>    */
>>>> public class CompetitionUserService extends
>>>> AbstractService<CompetitionUser>   {
>>>>
>>>>     /**
>>>>      * 識別子でエンティティを検索します。
>>>>      *
>>>>      * @param id
>>>>      *          識別子
>>>>      * @return エンティティ
>>>>      */
>>>>     public CompetitionUser findById(Integer id) {
>>>>       return select().id(id).getSingleResult();
>>>>     }
>>>>
>>>>     /**
>>>>      * 識別子の昇順ですべてのエンティティを検索します。
>>>>      *
>>>>      * @return エンティティのリスト
>>>>      */
>>>>     public List<CompetitionUser>   findAllOrderById() {
>>>>       return select().orderBy(asc(id())).getResultList();
>>>>     }
>>>>
>>>>     /**
>>>>      * UserIDが一致するエンティティを検索します。
>>>>      *
>>>>      * @param id
>>>>      * @return
>>>>      */
>>>>     public List<CompetitionUser>   findByUserId(Integer id) {
>>>>       String whereCond = "USER_ID = ?";
>>>>       return select().where(whereCond, id).getResultList();
>>>>     }
>>>>
>>>> }
>>>> ---------------------------------------------------------
>>>>
>>>> Test.javaの内容は以下の通りです。
>>>> DIしたい部分についてもコメントにて明記します。
>>>> ---------------------------------------------------------
>>>> package<rootパッケージ名>.util.portal;
>>>>
>>>> import javax.annotation.Resource;
>>>>
>>>> import<rootパッケージ名>.entity.User;
>>>> import<rootパッケージ名>.service.CompetitionUserService;
>>>>
>>>> public class Test implements Notifiable {
>>>>
>>>>     @Resource
>>>>     protected CompetitionUserService competitionUserService;
>>>> //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>> // ここがDIされずにnullとなってしまう!!!
>>>>
>>>>     @Override
>>>>     public Notification getNotification(User user) {
>>>>       if (competitionUserService.findByUserId(user.id) != null) {
>>>>         Notification notification = new Notification(notifyString,
>>>> notifyURL);
>>>>         return notification;
>>>>       }
>>>>
>>>>       return null;
>>>>     }
>>>>
>>>> }
>>>> ---------------------------------------------------------
>>>> ■--------状況説明ここまで--------■
>>>>
>>>>
>>>> ■--------調査状況説明ここから--------■
>>>>
>>>> 自分としては下記URLを参考にして調べてみました。
>>>>
>>>> http://s2container.seasar.org/2.4/ja/DIContainer.html#AutoBindingMode
>>>>
>>>> すべての条件を確認した結果は以下の通り問題なさそうに見えています。
>>>> 以下、すべての条件について現在の状況をご説明します。
>>>>
>>>> ・コンストラクタ・インジェクションが明示的に指定されている場合、自動バイ
>>>> ンディングは適用されません。
>>>> ⇒上記の通り指定していない。
>>>>
>>>> ・引数のないデフォルトコンストラクタが定義されている場合、自動バインディ
>>>> ングは適用されません。
>>>> ⇒上記の通りコンストラクタ自体作成していない
>>>>
>>>> ・引数の型がすべてインターフェースで最も引数の数の多いコンストラクタを選
>>>> 択され、その引数の型のコンポーネントが設定されます。
>>>> ⇒上記の通りコンストラクタ自体作成していない
>>>>
>>>> ・セッター・インジェクションが明示的に指定されている場合、自動バインディ
>>>> ングは適用されません。
>>>> ⇒diconでは指定していない。
>>>>
>>>> ・プロパティの型を実装したコンポーネントがコンテナに1つ登録されていて、
>>>> プロパティ名とコンポーネント名が一致する場合、そのコンポーネントが設定さ
>>>> れます。ただい、コンポーネント名にaaa_のようにサブパッケージ名がプレ
>>>> フィックスでついている場合、にサブパッケージ名のプレフィックスは除いて、
>>>> プロパティ名と比較します。コンポーネント名については、こちらを参照してく
>>>> ださい。
>>>> ⇒これに当てはまっているはずだがDIされない。
>>>>
>>>> ・プロパティ名と同一のコンポーネントがコンテナに登録されていて、プロパ
>>>> ティに代入可能なら、 そのコンポーネントが設定されます。
>>>> ・プロパティの型がインターフェースの場合、コンテナをその型で検索し、見つ
>>>> かったコンポーネントが設定されます。ただし、複数のコンポーネントが見つ
>>>> かった場合には、TooManyRegistrationRuntimeExceptionがスローされます。
>>>> ・プロパティの型がインターフェースの配列の場合、コンテナをその型で検索
>>>> し、見つかったコンポーネントの配列が設定されます。
>>>> ⇒上記で当てはまっているはずなので、関係ないはず。
>>>>
>>>> ■--------調査状況説明ここまで--------■
>>>>
>>>> CompetitionUserService.javaはserviceパッケージ配下にあるため
>>>> コンポーネント登録は自動で行われていると認識しておりますが、
>>>> もしかしてComponentの自動バインディングの範囲について制限が
>>>> ございますでしょうか?
>>>> (例えばactionパッケージ配下にあるクラスにしか自動バインディング
>>>>    されないなど。)
>>>>
>>>>
>>>> 以上、恐れ入りますが状況がお分かりの方がいらっしゃれば
>>>> お教え頂ければ幸いです。
>>>>
>>>> ■開発環境
>>>> OS:Windows 7 Home Premium (64bit)
>>>> ブラウザ: Firefox3.6.13
>>>> DB: mysql5.5
>>>> コンパイラ: jdk1.6.0_22
>>>> 使用中のライブラリ:(Jarを一部抜粋)
>>>>     - sa-struts-1.0.4-sp8.jar
>>>>     - struts-1.2.9.jar
>>>>     - mysql-connector-java-5.1.14-bin.jar
>>>>     - s2-framework-2.4.41.jar
>>>>     - s2-tiger-2.4.41.jar
>>>>     - s2-extension-2.4.41.jar
>>>>     - s2jdbc-gen-2.4.41.jar
>>>> _______________________________________________
>>>> Seasar-user mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>
>>>
>> _______________________________________________
>> Seasar-user mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-user
> 
> 


-- 
森本 將太
e-mail: [E-MAIL ADDRESS DELETED]


Seasar-user メーリングリストの案内