私は AspectJ を使用して LTW をセットアップし、かなり迅速かつ成功しました。セットアップは次のとおりです: beans.xml:
<context:annotation-config />
<aop:aspectj-autoproxy />
<context:spring-configured />
<context:load-time-weaver />
<context:component-scan base-package="com.test.service" />
クラスに自動配線される私のサービス:
@Service
public class MyService {
}
親クラス:
public class Bar {
}
サービスを自動配線し、Bar を拡張する構成可能なクラス。
@Configurable
public class BarExtended extends Bar{
@Autowired
private MyService service;
public MyService getWeavedInObject(){
return service;
}
}
そして、親クラス Bar への参照を持つクラスのみ:
public class Foo {
private Bar bar;
public void setBar(Bar bar) {
this.bar = bar;
}
}
そして成功したテストケース。BarExtended のインスタンスを作成し、LTW が機能しているかどうかを確認するだけです。Foo クラスは何もしません。
@Test
public void simple(){
Foo foo = new Foo();
BarExtended barExtended = new BarExtended();
assertNotNull("LTW didn't work.", barExtended.getWeavedInObject());
}
このテストは緑色で実行されます。しかし、次のテストは失敗します:
@Test
public void simple(){
Foo foo = new Foo();
BarExtended barExtended = new BarExtended();
foo.setBar(barExtended);
assertNotNull("LTW didn't work.", barExtended.getWeavedInObject());
}
クラス BarExtended が Foo に設定されている行を挿入するだけです。ダウンキャストにより、AspjectJ が機能しなくなります。
ところで、Foo クラスを BarExtended クラスを使用するように変更すると (したがって、アップキャストは必要ありません):
public class Foo {
private BarExtended bar;
public void setBar(BarExtended bar) {
this.bar = bar;
}
}
上記のテストは機能します。構成可能なオブジェクトがアップキャストされたときに、なぜ AspjectJ が非常に奇妙な動作をするのか、誰にもわかりますか?
編集:以下も失敗します:
@Test
public void simple() {
Foo foo = new Foo();
BarExtended barExtended = new BarExtended();
Bar bar = (Bar) new BarExtended();
foo.setBar(bar);
assertNotNull("LTW didn't work.", barExtended.getWeavedInObject());
}
別の BarExtended オブジェクトが Foo に設定され、最初の barExtended オブジェクトは AspectJ によって無視されます。しかし、リフレクションを使用して BarExtended をインスタンス化すると、次のようになります。
@Test
public void simple() throws InstantiationException, IllegalAccessException{
Foo foo = new Foo();
Bar barExtended = (Bar) BarExtended.class.newInstance();
foo.setBar(barExtended);
assertNotNull("LTW didn't work.", ((BarExtended)barExtended).getWeavedInObject());
}
奇妙ですね。
どうもありがとう
よろしく、
アンドレアス