我用 AspectJ 设置了 LTW,并且很快就成功了。这是设置:bean.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 在向上转换可配置对象时表现得如此奇怪?
编辑:Folwing 也失败了:
@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());
}
奇怪,不是吗?
非常感谢
问候,
安德烈亚斯