【发布时间】:2024-07-01 16:55:01
【问题描述】:
我正在尝试了解 Spring 代理机制,但我有一件事有问题。 我有接口:
public interface MyInterface{
void myMethod();
}
和实现类:
@Component
public class MyBean implements MyInterface{
@Override
public void myMethod(){
//do something
}
}
现在我创建Aspect,例如:
@Aspect
@Component
public class LogAspect {
@Before("execution(public * *(..))")
public void logBefore() {
System.out.println("Before aspect");
}
}
我有简单的入门课程:
@Configuration
@ComponentScan
@EnableAspectJAutoProxy
public class SpringAopApplication {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
SpringAopApplication.class);
MyBean bean = ctx.getBean(MyBean.class);
// MyInterface bean = ctx.getBean(MyInterface.class); //works
bean.myMethod();
ctx.close();
}
}
根据我们可以阅读的 Spring 文档:
如果要代理的目标对象至少实现一个接口 然后将使用 JDK 动态代理。所有接口 由目标类型实现的将被代理。如果目标对象 没有实现任何接口,那么将创建一个 CGLIB 代理。
但我收到一个错误没有定义 [MyBean] 类型的合格 bean。它仅在我通过@EnableAspectJAutoProxy(proxyTargetClass = true) 启用 CGLib 代理时才有效。
有人可以解释我在这里缺少什么吗?为什么使用 AOP 时没有发现 MyBean? ctx.getBean(MyInterface.class) 有效,但我无法想象这种接口的许多实现情况。
【问题讨论】:
标签: spring proxy spring-aop