Java实现AOP的几种方式.docxVIP

  • 85
  • 0
  • 约9.69千字
  • 约 12页
  • 2021-04-12 发布于天津
  • 举报
Java 实现 AOP 的几种方式 Spring AOP 实现机制标签: 人阅读 评论 (1) 收 人阅读 评论 (1) 收 藏 举报 分类: JAVA 技术( 34 藏 举报 分类: JAVA 技术( 34 ) 技术类( 11 ) (1) AOP 的各种实现在编译器修改源代码、 在运行期字节码加载 前修改字节码或字节码加载后动态创建代理类的字节码。以 是各种实现机制的比较: 类别分为静态 AOP (包括静态 织入)和动态 AOP (包括动态代理、动态字节码生成、自定 义类加载器、字节码转换)。静态织入:a、原理:在编译期, 切面直接以字节码形式编译到目标字节码文件中; 切面直接以字节码形式编译到目标字节码文件中 ;b 、优点: 对系统性能无影响; C、缺点:不够灵活; 动态代理:a、 原理:在运行期,目标类加载后,为接口动态生成代理类。 将切面织入到代理类中;b、优点:更灵活;C、缺点:切入 的关注点要实现接口; 动态字节码生成:a 的关注点要实现接口; 动态字节码生成: a、原理:在运行 期,目标类加载后, 动态构建字节码文件生成目标类的子类, 将切面逻辑加入到子类中;b、优点:没有接口也可以织入; C、缺点:扩展类的实例方法为 final时,无法进行织入; 自 定义类加载器a、原理:在运行期,目标加载前,将切面逻 c、辑加到目标字节码里;b、优点:可以对绝大部分类进行织 入;C、缺点:代码中若使用了其它类加载器,贝y这些类将 不会被织入; 字节码转换a、原理:在运行期,所有类加载 器加载字节码前进行拦截;b、优点:可以对所有类进行织 入;c、缺点: (2) Joinpoint c、 Pointcut : Jointpoint 的表达式,表示拦截哪些方法。一个 Pointcut 对应多个 Joinpoint ; Advice :要切入的逻辑。 Before Advice :在方法前切入; After Advice :在方法后 切入,抛出异常时也会切入;After Returning Advice 切入,抛出异常时也会切入; After Returning Advice :在 方法返回后切入,抛出异常不会切入;After ThrowingAdvice :在方法抛出异常时切入;Around Advice:在方法执行前后切入,可以中断或忽略原有流程的执行; 方法返回后切入,抛出异常不会切入; After Throwing Advice :在方法抛出异常时切入; Around Advice :在方 法执行前后切入,可以中断或忽略原有流程的执行; 目标 切面代理类 JointpointAdvicePointcutPointcut 切面 代理类 Jointpoint Advice Pointcut Pointcut 织入器 织入器 通过在切面中定义 pointcut 来搜索目标(被代理类)的 Jointpoint (切入点),然后把要切入的逻辑( advice )织入 在 JDK1.3 后引入的动态代理机制,使我们可以在运行期动 态的创建代理类。使用动态代理实现 AOP 需要四个角色: 被代理的类、被代理类的接口、织入器 到目标对象里,生成代理类。3 到目标对象里,生成代理类。 3)动态代理的实现 Java Proxy.newProxyInstance() )、InvocationHandler 。织入器 使用接口反射机制生成一个代理类,然后在这个代理类中织 入代码(切入逻辑) 。 InvocationHandler 是切面,包含了 Advice 和 Pointcut 。 动态代理在运行期通过接口动态生成 代理类。使用反射大量生成类文件可能引起 Full GC 造成性 方法区中能影响,因为字节码文件加载后会 存放在 JVM 运行时区的 方法区中 或持久代)。当方法区满的时候, 会引起 Full GC 。 因此当大量使用动态代理时,可以将持久代设置大一些,减 少 Full GC 次数。 动态代理的核心其实就是代理对象的生成, 即 Proxy.newProxyInstance() 。其中 getProxyClass() 方法用 于获取代理类,主要做了三件事:在当前类加载器的缓存里 搜索是否有代理类,没有则生成代理类并缓存在本地JVM 搜索是否有代理类,没有则生成代理类并缓存在本地 JVM 里。可以使用 JD-GUI 反编译软件打开 jre\lib\rt.jar 。 动态代 理生成的代理类,类似于:public class ProxyBusiness 理生成的代理类,类似于: public class ProxyBusiness implements IBusiness {privateInvocationHandler h; im

文档评论(0)

1亿VIP精品文档

相关文档