■scoped-proxyの問題点
バグかどうか判らないが、SpringのSessionスコープオブジェクトには問題がある。
下図のような構造でセッションが終了すると、依存関係があるにも関わらず、Bean_Aが破棄される前にBean_Bが破棄されてしまう。
Bean_A -(依存)-> proxyObject -(依存)-> Bean_B
何が困るかというと、これではBean_Aのdestroyメソッド以下でBean_Bを使用できない、という事になる。セッション終了時にログアウトやら掃除やらをしようと思っても、NullPointerExceptionが発生してしまう。proxyObjectはキチンと残るんだが。。
単純なセッションスコープ同士の依存関係であればそもそもproxyは必要ないのでこの問題は発生しないが、例えばBean_Bが、SingletonであるBean_Cからも依存されている場合にはどうしてもproxyが必要になってしまうので、これは大変困る。
ということで私の知っている回避策は、
「Bean_Bに対してラッパークラスと実装クラスの2種類を用意する」こと。
ラッパークラスはSingletonのBeanから参照する時に用い、proxyを使用する。
実装クラスはBean_Aに相当するBeanから参照する時に用い、proxyを用いず純粋なSessionオブジェクトとする。美しくはないが、これでキチンと動作する。
■singletonオブジェクトのdestoryメソッド
singletonオブジェクトはSpringコンテキストが破棄される際に一緒に破棄されるので、やはりdestroyメソッドを使って掃除作業をしたくなることもあると思う。
とても使いやすいのだけれども、TransactionManagerが先に破棄されてしまう事がある(確実に発生するかは不明)。そうなるとTransactionを使用した処理が不可能になってしまうので、その場合はdepends-onにTransactionManagerのBean名を記載する。
■applicationContext.xml の書き方
・ロードタイムウィービング
<context:load-time-weaver/>
・@Configurableを使用する場合
<context:spring-configured/>
・コンポーネントスキャン
<context:component-scan base-package="jp.hoge"/>
・宣言的トランザクション(AspectJモード)
<tx:annotation-driven mode="aspectj"/>
・@PersistenceContextを使用してインジェクションするBean PostProcessor (jpa)
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />