9

私はMySQLデータベースに接続する非常に小さなアプリケーションに取り組んでいます。

テーブルレコードを作成しようとしていますが、「トランザクションが進行中ではありません」。

私はすべての正しいものを用意しています:

  • サービスインターフェイスMyServiceとその実装MyServiceImpl
  • @Serviceでサービスimplに注釈を付けました
  • コントローラでは、フィールド@AutowiredMyServiceのインターフェイス名を使用しました
  • もともとrooによって生成されたので、正しいトランザクション構成を持っています
  • MyServiceImplが実装するパブリックメソッドMyService.create(...)があります

だが、

コントローラのmyServiceフィールドをリモートデバッグして検査すると、com.some.package.services.MyService @ 12345のようなもの($ Proxy73のようなものではありません)が表示されますが、これは正しくありません。自動配線する必要があるのはプロキシであるためです。彼は豆をターゲットにしているのではありません(これは私が思うことです)。私が正しければ、プロキシで@Transactionalアノテーションが付けられたパブリックメソッドを呼び出すときにのみアノテーションが開始されるため、トランザクションがないことは理にかなっています。

この設定でターゲットBeanを春に注入する理由を教えてください。

ありがとう

4

2 に答える 2

8

AspectJ対応のトランザクション管理(<tx:annotation-driven mode="aspectj" .../>)を使用している場合、トランザクションの適用は、ビルド中(コンパイル時のウィービング)または起動時(ロード時のウィービング)のいずれかで、同じクラスのインプレースで行われます。

を使用する場合のように)新しいクラスは作成されず、(Springの通常のインターフェースベースのAOPのように)プロキシも作成されません。代わりに、のバイトコードはMyServiceImplあなたが気付かないうちに直接変更されました。残念ながら、AOPを確認する唯一の方法は、クラスを逆コンパイルすることです。使用するjavap -c MyServiceImpl場合は、Springトランザクションレイヤーへの参照がたくさんあります。

于 2012-07-14T21:32:46.810 に答える
-3

Spring MVCを使用している場合は、サーブレットコンテキストファイルで特定のコントローラークラスのみをスキャンするようにしてください。それ以外の場合は2回スキャンされ、アプリケーションコンテキストでトランザクションを使用できません。

于 2012-10-15T06:45:41.447 に答える