Guiceでのトランザクション管理

MirageではGuiceとの連携用にMirageModuleというモジュールを提供しており、これを使用するとSqlManagerをDIできるようになります。が、提供しているのはそれだけで、トランザクション管理などは自前でなんとかしてください、というスタンスでした。
もちろんWebアプリであればMirageが標準で提供しているOpenSessionInViewFilterを使ってもよいのですが、Guice管理下のコンポーネントの任意のメソッドトランザクション境界としたい場合のために@Transactionalというアノテーションを付与しておくと自動的にトランザクションの制御を行う機能を追加してみました。使い方はこんな感じです。

public void EmployeeDao {

  @Inject
  private SqlManager sqlManager;

  @Transactional
  public Employee getEmployee(long empId){
    ...
  }

}

@TransactionalアノテーションがついてるメソッドにTransactionInterceptorが適用され、メソッドの開始前にトランザクションが開始され、メソッドの実行後にコミットされます。メソッドが例外をスローした場合、トランザクションロールバックされます。
例外を投げずにトランザクションロールバックする機能も必要かなぁ…。よく考えたらOpenSessionInViewFilteを使う場合も例外をスローしないとトランザクションロールバックできないですね。
ちなみにこのインターセプターはAOP Allianceな実装なので、SpringやSeasar2などでも使えるはず。ただ、Seasar2やSpringは自前でトランザクション制御の機能があるし、そっちのほうがなにかとメリットが多いのでわざわざMirageのインターセプターを使うメリットはないと思いますが…。