似懂非懂的 AspectJ
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
关于代理
在Java设计模式中,代理模式可以分为静态代理和Spring AOP中的动态代理。静态代理类似于房屋中介的角色,是在编译时就确定的代理关系。动态代理则是在运行时对目标方法功能进行增强,分为编译时增强和运行时增强两种。
静态代理
通过一个房屋出租的代码示例,解释了静态代理的概念和实现方式。在此模式中,中介类代理了房东的出租行为,并在出租前后添加了发布广告和收取中介费的行为。
动态代理
动态代理不改变原类方法的基础上,增强目标方法功能。它分为编译时增强和运行时增强。编译时增强如AspectJ,是在编译阶段生成代理类。运行时增强如Spring AOP,是在内存中生成代理类。
编译时增强
AspectJ是一种编译时增强的工具,它在编译阶段就生成了代理类。使用AspectJ需要一个专门的编译器ajc。
运行时增强
运行时增强使用JDK动态代理或CGLIB动态代理在内存中生成代理类,是Spring AOP的常用实现方式。
AspectJ 和 Spring AOP
AspectJ是AOP实现的一种方式,通过编译时增强来实现。而Spring AOP使用AspectJ提供的注解,但不采用编译时增强,而是运行时增强。
AspectJ
在IDEA中使用AspectJ需要安装插件,并配置使用ajc编译器。通过案例演示了AspectJ如何在编译时增强方法。
Spring AOP
虽然Spring AOP使用AspectJ的注解,却主要采用运行时增强。JDK动态代理和CGLIB动态代理分别演示了运行时增强的实现。
JDK 动态代理
JDK动态代理需要被代理的对象实现接口,它通过Proxy类和InvocationHandler实现方法代理。
CGLIB 动态代理
CGLIB动态代理不需要接口,使用Enhancer类和MethodInterceptor实现类的方法代理。
小结
静态代理、编译时增强的动态代理和运行时增强的动态代理都有各自应用场景。AspectJ具有对static、final方法和类的支持,无需Spring容器管理,支持编译后增强等优势,但Spring AOP以其简单易用性在日常开发中使用更广泛。
想要了解更多内容?