TxConnectionManager

ここ数日、久しぶりにJBossのソースを読んでおります。

今日気づいた驚愕の事実。

TxConnectionManagerはクラスコメントにはConnectionManager実装だと書かれているけれども、よくソースを見てみるとjavax.resource.spi.ConnectionManagerとは何の継承/実装関係も無かった♪

これって良いのかな?

もう少し読み進めると、BaseConnectionManager2クラスのallocateConnectionメソッドが以下のように宣言されていることに気づく。

// implementation of javax.resource.spi.ConnectionManager interface

public Object allocateConnection(ManagedConnectionFactory mcf, ConnectionRequestInfo cri) throws ResourceException

このBaseConnectionManager2はTxConnectionManagerの基底クラスであり、TxConnectionManagerではこのメソッドをオーバーライドしておらず、javax.resource.spi.ConnectionManagerインタフェースが定義しているメソッドはこのallocateConnectionメソッドだけとなっている。
http://java.sun.com/j2ee/sdk_1.3/ja/techdocs/api/javax/resource/spi/ConnectionManager.html

"実装事実上"ということで見るならば、確かにTxConnectionManagerはConnectionManagerとも言えるかな。しかしそうすると、なぜ「わざとimplements宣言から外されているのか」が気になりますねー。



追記:
結論、問題なし。というかなるほどーという感じ。

WrapperDataSouceクラスが呼んでいるのはあくまでBaseConnectionManager2$ConnectionManagerProxyクラスのallocateConnectionメソッドであり、このConnectionManagerProxyクラスはjavax.resource.spi.ConnectionManagerインタフェースを実装しているのだった。だからここから先の処理は別にインタフェース実装クラスで無くとも良いし、無理に実装させるほうが不自然。