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インタフェースを実装しているのだった。だからここから先の処理は別にインタフェース実装クラスで無くとも良いし、無理に実装させるほうが不自然。