Spring Framework 1.0.1 リリース
via id:dot:20040422#1082637179 via id:htsuyuki:20040422#p1
ひっそりとダウンロードできるようになってますね.
それなのに,なんで見つけられるの?(^^;
ML?
CanCam 6月号
日付が変わって発売日(23日)になったので,早速コンビニで購入してきました.あ,一言いっておきますが,決してCanCamを蛯原友里写真集と間違えて買ってきたわけではありませんよぉ.あくまでも,彼女と楽しく会話するためのネタとして買ってきただけです.その証拠に,JJとRayも一緒に買ってきました... 心より恥じる.
とはいえ蛯原友里を応援するこの日記としては,友里ちゃんを取り上げないわけにはいきません.ということで(いみふめ),レポートです.
実はひそかに友里ちゃん半年ぶりの単独表紙を期待したのですが,今月は押切もえちゃんでした.残念.しかし,もえちゃん単独表紙はこれが初めてだったんですねぇ.すっごく意外です.それじゃしょうがないかなぁ,と一応納得.来月は是非とも友里ちゃん単独表紙でお願いしたい.>CanCam編集部
テレビ出演の影響もあるのか,友里ちゃんの登場ページは以前より少ない気がしないのでもないですが,その分(?)大きめの写真が多いのでよしとしましょう.
なかでもP30〜P39にかけてはかなり満足できる写真の連続.もう最高!
予想はしていましたが,水着のコーナーでは出番なし(苦笑).
もはやこれがなければCanCamではないと言っても過言ではない,「優OL vs エビちゃんOL」という1ヶ月CD(コーディネート)のコーナーでは,6ページに渡って1ヶ月分30+2カットの友里ちゃんが怒濤のごとく掲載されています.特に注目はP123,髪をアップにしています.これまた最高.
P176ではバイクの後ろに腰掛けているのですが... すげー脚ほそー!なげー! 体うすー! こういうスレンダーなスタイル大好き! あぁ,これはグラビア系が好きな人には通じないんだろうなぁ.
P307では珍しくバンダナ巻いてます.こうやって見ると若い頃(二十歳くらい?)と印象が変わってないんだなぁ,と変に感心.友里ちゃん,テレビで見ると年相応(24歳)な感じだけど,CanCamで見ると二十歳くらいかと思うような写真が多い気がします.最初,山田優ちゃんより年上だとは思ってなかったもんなぁ.っていうか優ちゃん絶対二十歳に見えないってことですが.
P27の「CanCamモデルリレー連載」では3回目にして友里ちゃん登場.今月買ったもの大公開ということなんですが,「友里にそっくり!?のブライス人形」... うーん,似てるか?
今月のCanCamはちょっと薄めとはいえそれでも500ページもあるため,まだざっとしか見ていませんが,こんなところかな.いやぁ,当分楽しめそうです.
その他今月号で目に付いたのは,ちょっと前からCanCam専属になった徳澤直子ちゃん.Seventeenだったかで人気のあった子らしいけれど,そこら中に出まくってます.この子もここ数年のCanCam顔(目が離れ気味で口が大きめ)ですねぇ.いずれ優や友里ちゃんが卒業した後のエース候補なのでしょうか.
という具合に何人かまぶしてみたので,出勤前にぐぐってみてください>ひがさん
ちなみに臼田あさ美のどアップきれいめ写真も何枚かあるので見てみそ>まこたん
ZaizenerOff(仮) tpircs教祖の総回診です
「多少おかしくないと正気ではてなでZaizener集めて,総回診なんて実行したりできんよ!」 ってことで、ちゃんちゃらおかしいかもしれませんがid:koichikさんの呼びかけにより実現です! 乾杯の音頭は「無念だ・・・」で(w。
総回診日時 4月28日。場所とか店とかどうしましょーかね? 川崎がいいですかね? 当方、川崎 or 品川 or 新橋キボンヌです。 参加資格は「Zaizenerとは何か知っている」「Zaizenerとは何か気になる」「Zaizenerには興味ないけどなんとなく」でいいですかね? > Zaizenerの皆様。
ということでZaizenerの皆様,結集しましょう.
参加表明はtpircs教祖の日記にコメントでお願いします〜.
Wiki作ってくれちゃってます.
http://www.wikiroom.com/tpircs/?ZaizenerOFF
もうそういう時代なんですねぇ.自分にはそういうフットワークみたいなのが足りてないなぁ.
お仕事スタイル
- 黒のジップアップブルゾン(VIKTOR & ROLF Monsieur 03-04AW)
- 黒とグレイのボーダーニット(BURBERRY Prosum 03SS)
- 黒のベルベットパンツ(JIL SANDER 03-04AW)
- 黒のショートブーツ(JIL SANDER 03-04AW)
もうブーツはありえねーだろって感じなんですが,パンツのすそ幅が16cmだったかな? 超細いのでついついブーツに合わせたくなってしまいます.
Spring Framework 入門記 Transactionその3 JTA
今日は待ち時間の長い作業をやっているため普段より早めの入門記,今回はJTA(Java Transaction API)を使用します.
JTAといえば,先日書いた「JTA/JTS」なんですが,はぶさんの日記からたどって来てくれた人がたくさんいらしゃるようで.リファ見てる限り過去最高です.それまでは「僕の生きる道」のキーワードからが最高だったのですが,さすがはぶさん,人気ドラマを越えてます.すごいなぁ.
その「JTA/JTS」で書いたように,JTAはX/Open DTPの焼き直しのような仕様で,
UserTransaction
- アプリとトランザクションマネージャ間のインタフェース.X/Open DTPのTXに相当.
XAResource
- トランザクションマネージャとリソースマネージャ間のインタフェース.X/Open DTPのXAに相当.
という二つの主要なinterface
があるのですが,JTAにはもう一つ,
TransactionManager
- アプリケーションサーバ(コンテナ)とトランザクションマネージャ間のインタフェース.
というのも用意されています((JTAを実装するには他のinterface
も理解する必要がありますが,ここでは不要ということで他は無視.)).
X/Open DTPの頃は,TMは事実上TPモニタそのもので,独立したコンポーネントという扱いではなかったのですが,JTAでは一つのコンポーネントとしてプラガブルに扱えるようにデザインされているのですね.
これらのinterface
のうち,XAResource
は通常JDBCドライバの一部として提供されたりします.そして,UserTransaction
やTransactionManager
は,JTAの実装が提供します.
Springでは独自のJTA実装を提供していませんが,別途JTAを用意して利用することができるようになっています.
そのためには,前回まで使ってきたDataSourceTransactionManager
に代えて,JtaTransactionManager
を使用します.これも当然,PlatformTransactionManager
をimplements
したクラスです.
JtaTransactionManager
は,次のプロパティを持っています.
userTransaction
userTransactionName
transactionManager
transactionManagerName
jndiTemplate
このうち,userTransactionName
とtransactionManagerName
は,JNDIからルックアップしてそれぞれのインスタンスを取得する際に設定します.その場合は,InitialContext
の初期化に必要なプロパティ(Properties
の意味のプロパティ)をjndiTemplate
に設定します.
JNDIを使わない場合は,userTransaction
およびtransactionManager
を設定します.
なお,userTransaction
をimplements
したクラスがTransactionManager
もimplements
している場合は,transactionManager
またはTransactionManagerName
の設定は省略できます.これ,逆でもいいと思うんですけどねぇ.インタフェース的にUserTransaction
はTransactionManager
のサブセットなので,TransactionManager
が設定されていればUserTransaction
は設定しなくてもいいっていう方がいいような気がするのですが... 無念だ.
SpringでJTAを使うのに必要なことは以上でOKみたいです.
それで次はJTA実装を用意するわけですが,通常はアプリケーションサーバが提供するJTA実装を使うことが多いのだろうと思われます.しかし今回は,我らがひがさんによるJTA実装,S2JTAをSpringで使ってみることにしましょう.S2JTAはS2のコンテナとは独立しているということで,たぶんSpring上でも使えるとひがさんの03/25の日記に書かれていたので,いつかやらねばと思っていたのです.ついに,その日がやってまいりました!
ということで,S2JTAを見ていきます.
S2JTAはS2コンテナからは独立しているのですが,そのS2JTAをS2コンテナに組み込むための設定ファイルがj2ee-config.xml
です.その解説が「コネクションプーリング」というドキュメントにまとまっています((ConnectionPoolImpl
のxaDataSource
というプロパティはXADataSource
が正しいと思われ>ひがさん)).なるほど.これをそのままSpringの定義ファイルに持っていけばよさげです.
必要なコンポーネントは次の4つです.
org.seasar.extension.jta.TransactionManagerImpl
TransactionManager
をimplements
したクラス.文字通りのトランザクションマネージャです.org.seasar.extension.dbcp.impl.XADataSourceImpl
XAResource
をimplements
したクラスで,普通(XA非対応)のJDBCドライバをJTAで使えるようにしてくれます.org.seasar.extension.dbcp.impl.ConnectionPoolImpl
- いわゆるコネクションプールで,トランザクションマネージャと連携して,トランザクション終了時にコネクションをプールに戻してくれたりします.
org.seasar.extension.dbcp.impl.DataSourceImpl
DataSource
をimplements
したクラス.コネクションプールをDataSource
として使うためのアダプタという位置付けみたいです.
このように,トランザクションマネージャと連携するコネクションプール上にDataSource
を用意してくれているので,SpringのDataSourceUtils
のようなものが不要なんですね.さすが.
ちょっと問題になったのは,(2.0.5以前の)S2にはUserTransaction
をimplements
したクラスが存在しないこと.S2で使う分には必要ありませんからねぇ.ということで,S2のTransactionManagerImpl
を次のように修正しました.
public final class TransactionManagerImpl implements TransactionManager, UserTransaction {
先ほども書いたように,UserTransaction
はTransactionManager
のサブセットなので,新たにメソッドを実装する必要はありません.この修正はS2の新しいリリースに含めてもらえるみたい? です.
さて,それではSpringでS2のJTAを使うための定義ファイルです.基本的に前々回のTransactionProxyFactory
版をベースに,JTA対応を行いました.こんな感じです.
<!-- S2の設定 --> <bean id="jtaTM" class="org.seasar.extension.jta.TransactionManagerImpl"/> <bean id="xaDataSource" class="org.seasar.extension.dbcp.impl.XADataSourceImpl"> <property name="driverClassName"><value>org.hsqldb.jdbcDriver</value></property> <property name="URL"><value>jdbc:hsqldb:.</value></property> <property name="user"><value>sa</value></property> <property name="password"><value></value></property> </bean> <bean id="connectionPool" destroy-method="close" class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl"> <property name="transactionManager"><ref bean="jtaTM"/></property> <property name="XADataSource"><ref bean="xaDataSource"/></property> </bean> <bean id="dataSource" class="org.seasar.extension.dbcp.impl.DataSourceImpl"> <constructor-arg><ref bean="connectionPool"/></constructor-arg> </bean> <!-- Spring TMの設定 --> <bean id="springTM" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="userTransaction"><ref bean="jtaTM"/></property> </bean> <bean id="debug" class="org.springframework.aop.interceptor.DebugInterceptor"/> <!-- アプリケーションの設定 --> <bean id="foo" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="target"> <bean class="study.Foo"> <property name="dataSource"><ref bean="dataSource"/></property> </bean> </property> <property name="transactionManager"><ref bean="springTM"/></property> <property name="transactionAttributes"> <props> <prop key="insert">PROPAGATION_REQUIRED,+java.lang.UnsupportedOperationException</prop> <prop key="update">PROPAGATION_REQUIRED,-java.io.IOException</prop> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> <property name="postInterceptors"><ref bean="debug"/></property> </bean>
うん,やっぱりTransactionProxyFactory
の方が素敵!(キラッ)
S2JTAの設定のところは,ほとんどj2ee-config.xml
のパクリです.
そして,SpringのTMとしてJtaTransactionManager
を定義しています.そのuserTransaction
プロパティには,S2JTAのTransactionManagerImpl
を設定しています.これはTransactionManager
でもありますから,transactionManager
プロパティの設定は省略しています.
残りのお試しクラスFoo
は前回と同じ,実行用のクラスは前々回と同じです.
それを実行すると...
Debug interceptor: count=1 invocation=[Invocation: method=[public void study.Foo.createTable 以下略 Debug interceptor: next returned - Initiating transaction commit Debug interceptor: count=2 invocation=[Invocation: method=[public void study.Foo.insert 以下略 Debug interceptor: next returned - Initiating transaction commit Debug interceptor: count=3 invocation=[Invocation: method=[public java.lang.String study.Foo.query 以下略 Debug interceptor: next returned - Initiating transaction commit Ebihara Debug interceptor: count=4 invocation=[Invocation: method=[public void study.Foo.insert 以下略 - Initiating transaction commit Debug interceptor: count=5 invocation=[Invocation: method=[public java.lang.String study.Foo.query 以下略 Debug interceptor: next returned - Initiating transaction commit Yada Debug interceptor: count=6 invocation=[Invocation: method=[public void study.Foo.update 以下略 - Invoking rollback for transaction on method 'update' in class [study.Foo] due to throwable [java.io.IOException] - Initiating transaction rollback Debug interceptor: count=7 invocation=[Invocation: method=[public java.lang.String study.Foo.query 以下略 Debug interceptor: next returned - Initiating transaction commit Yada
かーんぺき!!
と,こんな感じなんですが,これで早くもトランザクション編は終わりにしようかと.まだプログラマティックにトランザクションを扱うとか,アプリケーションサーバ上で使うとかがドキュメントにはあるのですが,あまり興味をもてないもので.心より恥じる.
ということで,次回からは「Chapter 7. Source Level Metadata Support」に進みたいと思います.「AOPその14 Metadata-Driven Autoproxying」でやったメタデータのことなのかな? それにいきます.