不是问aop怎么用,是实现原理,我也知道是动态代理,也知道jdk有自带的和第三方框架可以实现动态代理。比如ioc这两个注解 @Component和@Autowired,原理我猜就是程序启动,扫描带有前者的类,创建一个对象然后找到带有后者的字段给赋值就行了。但是spring aop是怎么拦截带自定义注解的方法A,然后在调用A方法时,实际调用的是@Aspect类的方法B的,请问这是怎么实现的。
AOP的实现原理是基于两种技术:动态代理和字节码操作。
在运行时,AOP框架通过动态代理技术为被拦截对象创建一个代理对象,该代理对象会将指定的方法进行拦截,并调用对应的切面方法。这种动态代理技术分为JDK动态代理和CGLIB动态代理两种。
对于JDK动态代理,代理对象必须实现至少一个接口,它会在运行时动态生成一个代理类,实现被代理接口,并将方法调用转发给InvocationHandler处理器处理。在AOP中,MethodInterceptor就是一个InvocationHandler的实现方式,它拦截代理对象方法的调用,并根据具体逻辑执行对应的切面方法。
对于CGLIB动态代理,代理对象为类对象(非接口),原理是通过创建被代理类的子类,并重写需要拦截的方法,从而实现代理的效果。在AOP中,MethodInterceptor同样是实现了CGLIB的Callback接口,拦截代理对象对应方法的调用,并执行对应的切面方法。
除了动态代理,还有一种方式可以实现AOP,就是通过字节码操作技术。通过在程序员指定的类中,插入字节码来进行方法拦截。这种方式比动态代理更加灵活,但是需要对字节码有一定的了解,使用起来相对更为复杂。