@Transactional
注釈でマークされたDAOメソッドが実行されるたびに、TransactionInterceptor
を使用して、データベースの一部の情報をThreadLocal
に設定しています。照会を異なるデータベース・パーティションに経路指定できるようにするためには、これが必要です。Spring Bean自体がAOPプロキシでラップされているかどうかを検出するにはどうすればよいですか?
これは、ほとんどのDAOのメソッドのために正常に動作します:
// this causes the invoke method to set a thread-local with the host name of
// the database server the partition is on
@Transactional
public int deleteAll() throws LocalDataException {
我々はDAOの内部DAO 代理オブジェクト自体を参照する必要があるときに問題があります。通常、私たちは、呼び出し側がプロキシDAOを渡す持っている必要があります:
public Pager<Foo, Long> getPager(FooDao proxyDao) {
これは明らかに総あるコードに次のようになります。
fooDao.getPager(fooDao);
問題は、私たちがFooDaoの内側にあるとき、this
は我々が必要ないプロキシDAOであるということです。
Beanの周囲にプロキシラッパーがあることを発見するためのより良いメカニズムがありますか?私はSpring AOPUtilsを見ましたが、オブジェクトのプロキシを見つける方法がありません。私は例えばisAopProxy(...)
を望ましくない。私もSpring AOP docsを読んだことがありますが、私が避けたいと思っていた自分のAOPネイティブコードを実装していない限り、そこには解決策が見えません。
私は、ApplicationContextAware
ユーティリティー・ビーンとsetProxyDao(...)
メソッドを使ってDAOを自分自身に注入できると思うが、それはハックのようだ。他のアイデアはどのように私は、Bean自体の中からそれを利用できるようにプロキシを検出することができますか?助けてくれてありがとう。
オプションを持たないネイティブのAspectjロード/コンパイル時間を使用しています - アドバイスはプロキシーに織り込まれているので、プロキシとこの参照がプロキシ内で発行されるべきではありませんか? –
'this'は@Thorbjørnを行いません。なぜなら、ポストステートとして、私はプロキシ_not_ bean自体を必要とするからです。 – Gray
私自身のネイティブAOPを書くことは、私の唯一の解決策@Bijuかもしれません。できればそれを避けることを望んでいた。ありがとうtho。 – Gray