AOP是如何实现的?

Spring中的AOP代理还是离不开Spring的IOC容器,代理的生成,管理及其依赖关系都是由IOC容器负责;Spring默认使用JDK动态代理,在需要代理类而不是代理接口的时候,Spring会自动切换为使用CGLIB代理,不过现在的项目都是面向接口编程,所以JDK动态代理相对来说用的还是多一些。

JDK动态代理(默认使用):

代理类实现InvocationHandler接口,加上反射生成一个实现代理接口的匿名类,调用具体方法前调用该代理类来处理。

具体步骤:

通过@Aspect注解定义一个切面类:指定切点,通知,如果你是想使用的注解方式灵活切入,也需要指定切入的注解(注解需要自己定义)。

CGLIB动态代理:

利用ASM开源包,把代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

可以通过在pom中引用Cglib类库然后在spring配置文件中设置开启 来强制使用。

注意:

Spring会自动在JDK动态代理和CGLIB之间转换。

在jdk1.6前Cglib比JDK更快(因为ASM生成代理类比反射效率更高)

而之后JDK更快,比Cglib高了不止20%,Cglib明显跟不上了。

猜你喜欢

转载自blog.csdn.net/zhangyu672090/article/details/82823227