请问spring aop的实现原理

不是问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,就是通过字节码操作技术。通过在程序员指定的类中,插入字节码来进行方法拦截。这种方式比动态代理更加灵活,但是需要对字节码有一定的了解,使用起来相对更为复杂。

针对你的问题,@Aspect注解就代表了一个切面,通过在被拦截方法上指定拦截器(即切面)的方式,来达到对特定方法的拦截。在Spring框架中,主要是使用了JDK动态代理技术来实现拦截器和切面的功能。当使用@Aspect注解时,Spring框架会根据注解信息创建一个切面对象,将该对象传递给ProxyFactoryBean或者AspectJProxyFactory来生成代理对象,这个代理对象最终用来替换原有的Bean对象。

因此,@Aspect注解定义的切面不会直接拦截到方法,而是在Spring容器中以Bean的形式存在,实际会生成一个代理对象,拦截到特定的调用后,再调用对应的切面方法。整个AOP的实现过程,就是Spring框架利用动态代理技术,在程序运行时动态生成代理对象,并在这个代理对象中实现拦截器对指定方法的拦截。