-
Type: Bug
-
Resolution: Fixed
-
Priority: Minor
-
Affects Version/s: 2.4.7
-
Component/s: S2Container
-
None
FileSystemComponentAutoRegister を、たとえば以下のように使うとする。
<component class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister"> <property name="instanceDef"> @org.seasar.framework.container.deployer.InstanceDefFactory@REQUEST </property> <property name="autoNaming"> <component class="org.seasar.framework.container.autoregister.DefaultAutoNaming"/> </property> <initMethod name="addClassPattern"> <arg>"a.b"</arg> <arg>"^.*Impl$"</arg> </initMethod> <initMethod name="addClassPattern"> <arg>"a.b.c"</arg> <arg>"^.*Default$"</arg> </initMethod> <initMethod name="registerAll"></initMethod> </component>
このケースでは、
- a.bおよびその配下のパッケージの なんとかImpl が登録される
- a.b.cおよびその配下のパッケージの なんとかDefault が登録される
ように思われるのだが、実際には a.b.cおよびその配下のパッケージのなんとかDefaultのregisterは2回走る。
バグかどうかはハッキリしないのでコミッタの方の判断にお任せしますが、以下のように考えました。
- FileSystemComponentAutoRegister}}の {{registerAll は {{ClassPattern}}の繰り返し(for-each)処理をしている
- ClassTraversal#traverseFileSystem から ClassHandler として {{FileSystemComponentAutoRegister}}がコールバックされる
- ClassHandler}}としての実装は {{AbstractComponentAutoRegister に存在
- AbstractComponentAutoRegister#processClass は自身の中でもう一度 {{ClassPattern}}に対して繰り返し(for-each)処理をしている
- ここが問題では?
- ClassPattern}}についての繰り返し処理は 最初の {{registerAll だけにしたほうがいいのでは? (考察できていませんが)
如何でしょうか。