Java实现AOP有几种方式?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

Java实现AOP有几种方式?

本问题来自云栖社区【阿里Java技术进阶2群】。https://yq.aliyun.com/articles/690084 点击链接欢迎加入社区大社群。

展开
收起
李博 bluemind 2019-04-28 17:36:05 9845 0
15 条回答
写回答
取消 提交回答
  • aop有静态和动态之分 静态实际开发中很少用到 动态又分jdk动态代理和cglib动态代理,两者各有优缺点

    2020-03-31 19:16:51
    赞同 展开评论 打赏
  • 字节码:重新编译Java字节码,将切面插入字节码的某些点面上,如cglib 类加载器:定制类加载器,在类加载时对字节码进行补充,在字节码中插入切面,如Java Agent 动态代理组件:Java提供的动态代理

    2020-03-26 23:36:39
    赞同 展开评论 打赏
  • jdk的动态代理和cglib

    2020-03-21 14:27:10
    赞同 展开评论 打赏
  • 静态和动态

    2020-03-18 17:00:48
    赞同 展开评论 打赏
    1. 静态AOP:在编译期,切面以字节码的形式编译到目标字节码文件中,属于编译时字节码增强,通过@AspectJ注解实现。
    2. JDK动态代理:利用反射机制,在运行期,目标类加载后,为接口动态生成代理类。通过实现InvocationHandler接口实现。
    2020-03-12 17:39:24
    赞同 展开评论 打赏
  • 技术架构师 阿里云开发者社区技术专家博主 CSDN签约专栏技术博主 掘金签约技术博主 云安全联盟专家 众多开源代码库Commiter

    基于JDK的动态代理,和基于CGLIB的动态代理

    2019-11-12 17:16:50
    赞同 展开评论 打赏
  • 1、静态AOP:在编译期,切面直接以字节 码的形式编译到目标字节 码文件中。 AspectJ属于静态AOP,是在编译时进行增强,会在编译的时候将AOP逻辑织入到代码中,需要专有的编译器和织入器。

    优点:被织入的类性能不受影响。 缺点:不够灵活 2、动态AOP(JDK动态代理):在运行期,目标类加载后,为接口动态生成代理类,将切面植入到代理类中。 Java从1.3引入动态代理。实现原理是为被代理的业务接口生成代理类,将AOP逻辑写入到代理类中,在运行时动态织入AOP,使用反射执行织入的逻辑。 主要实现方式依赖java.lang.reflect包下的InvocationHandler和Proxy类。

    优点:Java标准库原生支持,使用简单,无需引用额外的包。相对于静态AOP更灵活。 缺点:带代理的类必须是接口,灵活性受到一些限制;使用反射会影响一些性能。 3、动态代码字节生成:在运行期,目标类加载后,动态构建字节码文件生成目标类的子类,将切面逻辑加入到子类中。 CGLib是动态代码字节生成的实现,它封装字节码生成工具Asm,原理是在运行期间目标字节码加载后,生成目标类的子类,将切面逻辑加入到子类中,所以使用Cglib实现AOP不需要基于接口。

    优点:没有接口也可以织入,灵活性高。 缺点:扩展类的实例方法为final时,则无法进行织入 4、自定义类加载器:在运行前,目标加载前,将切面逻辑加到目标字节码中。 可以考虑javassist来实现。Javassist 是一个编辑字节码的框架,可以让你很简单地操作字节码。它可以在运行期定义或修改Class。使用Javassist实现AOP的原理是在字节码加载前直接修改需要切入的方法。

    优点:可以对绝大部分类织入。 缺点:如果用到了其他类加载器,则这些类将不被织入

    2019-10-30 17:26:52
    赞同 展开评论 打赏
  • 为之则易,不为则难

    spring中有两种方式实现AOP。 在实现接口的情况下,利用的是jdk的动态代理方式实现aop ,没有实现接口时,使用cglib方式实现,cglib实现原理是通过字节码技术生成了一个继承于被代理类的代理类来实现代理的

    2019-10-30 16:14:51
    赞同 展开评论 打赏
  • xml配置和注解。其原理就是动态代理,包括jdk的动态代理和cglib

    2019-10-30 15:47:00
    赞同 展开评论 打赏
  • 上海建鹏信息技术有限公司架构师,喜欢研究技术,乐观。。

    jdk和cglib,jdk需要实现接口,cglib则是通过继承的方式

    2019-10-16 14:51:56
    赞同 展开评论 打赏
  • java爱好者,文档生成工具jdoc作者

    jdk和cglib

    2019-09-11 15:22:11
    赞同 展开评论 打赏
  • 在springboot中,如果实现了接口的话是jdk的动态代理,没有实现接口的话是cglib的动态代理

    2019-07-17 23:34:31
    赞同 2 展开评论 打赏
  • jdk和cglib

    2019-07-17 23:34:30
    赞同 展开评论 打赏
  • JAVA开发工程师

    我只知道 动态AOP, 静态AOP,操作字节码这三种

    2019-07-17 23:34:30
    赞同 展开评论 打赏
  • 北京工业大学在校硕士生,研究可信计算。

    面向切面编程,我只是简单的使用过。

    2019-07-17 23:34:30
    赞同 展开评论 打赏
滑动查看更多
问答分类:
问答标签:
问答地址:
相关产品:
问答排行榜
最热
最新
相关电子书
更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native
立即下载
The Reactive Cloud Native Arch
立即下载
JAVA开发手册1.5.0
立即下载