Я устанавливаю LTW с AspectJ и весной довольно быстро и успешно. Вот установка: beans.xml:AspectJ и Spring LTW не работает при повышении уровня
<context:annotation-config />
<aop:aspectj-autoproxy />
<context:spring-configured />
<context:load-time-weaver />
<context:component-scan base-package="com.test.service" />
Моя служба, которая будет autowired к классу:
@Service
public class MyService {
}
Родитель класса:
public class Bar {
}
Конфигурируемые класс, что autowires обслуживание и расширение Бар.
@Configurable
public class BarExtended extends Bar{
@Autowired
private MyService service;
public MyService getWeavedInObject(){
return service;
}
}
И просто класс, который получил Referance для родительского класса 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 ведет себя так странно, когда настраиваемый объект взвинчен?
Редактировать: Follwing терпит неудачу, а также:
@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());
}
Странно, не так ли?
Большое спасибо
С уважением,
Andreas
Какие версии Java, AspectJ вы используете? – Ralph
Я использую Java 1.6, aspectj 1.6.12 und Spring 3.1.0.RELEASE. – noCodeFound
Кровавый ад, я тоже испытываю эту проблему. Я только что поднял эту проблему в своей JIRA вместе с воспроизводимым тестовым случаем: https://jira.spring.io/browse/SPR-12901 – bertie