Google Groups に参考になるスレッドが上がってた。
addXXXObserver(component), where to call? is singleton required?
そこからのリンクMy Take on Transfer ORM Event Model - BeforeCreate Example 。
Observer の登録の仕方だ。これを参考にすると、すっきりした。
ColdSpring.xml
<bean id="ObserverInjector" class="&topOfPackage;.model.observer.ObserverInjector" lazy-init="false">
<constructor-arg name="ormService"><ref bean="ormService" /></constructor-arg>
<constructor-arg name="observer"><ref bean="observer" /></constructor-arg>
</bean>
shopping.model.observer.ObserverInjector.xml の init 関数
<cffunction name="init" access="public" returntype="any" hint="I am used to add the observer to Transfer.">
<cfargument name="ormService" type="transfer.TransferFactory" required="true" />
<cfargument name="observer" type="any" required="true" />
<cfset variables.transfer = arguments.ormService.getTransfer() />
<cfset variables.transfer.addAfterCreateObserver(arguments.observer) />
<cfset variables.transfer.addAfterUpdateObserver(arguments.observer) />
<cfreturn this />
</cffunction>
こうすることによって、モデル内で、setObserver が要らないし、observer を transfer に登録する必要がない。
で、特定の Transfer オブジェクトにだけ、observe したいのであれば、observer 内の各関数で、
arguments.event.getTransferObject().getClassName()
とすることでオブジェクト名がわかるから、それに応じて、分岐させてやればよい。