Spring предпочитает использовать интерфейсы для AOP, потому что он может использовать JDK прокси .
Скажем, например, у меня есть интерфейс MyService
public interface MyService {
void doSomething();
}
Иреализация MyServiceImpl
@Service
public class MyServiceImpl implements MyService {
public void doSomething() {
// does something!
}
}
Если Spring обнаружит, что вы сконфигурировали аспекты для MyService
, он создаст прокси JDK, который реализует MyService
, а затем проксирует все вызовы до вашего компонента MyServiceImpl
добавление функциональных возможностей аспектов там, где это необходимо.
JDK-прокси работают путем реализации того же интерфейса, что и целевой объект, и делегирования ему вызовов;они не работают, если нет интерфейса для реализации.Если у вас нет интерфейса, подобного описанному выше, Spring необходимо использовать библиотеку байт-кода, такую как CGLIB, для динамического создания классов во время выполнения, которые включают в себя функциональность аспектов.