Опитвам се да разбера каква е използваемостта на декларациите между типове в Spring AOP, но съм заседнал с един проблем, който го прави малко безполезен.
HelloMixin
аспектът декларира, че препоръчаните услуги изпълняват HelloService
и предоставя изпълнение по подразбиране HelloServiceImpl
.
@Aspect
public class HelloMixin {
@DeclareParents(value = "xxx.xxx.services.*+", defaultImpl = HelloServiceImpl.class)
static HelloService mixin;
}
Тогава имам две услуги:
@Service
public class FirstService {
private String name = "First";
public String getName() {
return name;
}
}
@Service
public class SecondService {
private String name = "Second";
public String getName() {
return name;
}
}
Нов интерфейс:
public interface HelloService {
public void sayHello();
}
Реализация по подразбиране:
public class HelloServiceImpl implements HelloService {
private String getName() {
return "defaultName";
}
@Override
public void sayHello() {
System.out.println("Hello " + getName());
}
}
Екзекуция:
@Autowired
@Qualifier("firstService")
HelloService firstService;
@Autowired
@Qualifier("secondService")
HelloService secondService;
public String hello() {
firstService.sayHello();
secondService.sayHello();
}
Резултат:
INFO: Hello defaultName
INFO: Hello defaultName
Тази концепция можеше да бъде наистина страхотна, ако имах начин да използвам getName
метода от препоръчани обекти. В противен случай не виждам смисъл да го използвам, ако не мога да напиша никаква обектно-зависима логика. Възможно ли е? С други думи бих искал да видя резултата:
INFO: Hello First
INFO: Hello Second