1、静态代理和动态代理的概念:

  在我的另一篇博文:Java 静态代理和动态代理 中有讲到,这里就不做赘述了。

  JDK动态代理它的好处理是可以为我们生成任何一个接口的代理类,并将需要增强的方法织入到任意目标函数。

  但它仍然具有一个局限性,就是只有实现了接口的类,才能为其实现代理。

2、CGLIB

  CGLIB解决了动态代理的难题,它通过生成目标类子类的方式来实现来实现代理,而不是接口,规避了接口的局限性。
  CGLIB是一个强大的高性能代码生成包,其在运行时期(非编译时期)生成被 代理对象的子类,并重写了被代理对象的所有方法,从而作为代理对象。

要使用CGLIB先要在POM文件中引入

  1. <dependency>
  2. <groupId>cglib</groupId>
  3. <artifactId>cglib</artifactId>
  4. <version>2.2.2</version>
  5. </dependency>

  1、业务类

  1. public class UserServiceImpl {
  2. public void addUser() {
  3. System.out.println("=========增加用户==========");
  4. }
  5. }

  2、代理类

  1. import java.lang.reflect.Method;
  2. import net.sf.cglib.proxy.Enhancer;
  3. import net.sf.cglib.proxy.MethodInterceptor;
  4. import net.sf.cglib.proxy.MethodProxy;
  5.  
  6. public class UserCglib implements MethodInterceptor {
  7. private Object _obj;
  8. public Object getInstance(Object obj) {
  9. this._obj = obj;
  10. Enhancer enhancer = new Enhancer();
         // 设置代理目标
  11. enhancer.setSuperclass(this._obj.getClass());
  12. // 设置回调
  13. enhancer.setCallback(this);
  14. //创建代理对象
  15. return enhancer.create();
  16. }
      //回调方法
  17. @Override
  18. public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable {
  19. System.out.println("=========执行前==========");
  20. Object result = proxy.invokeSuper(object, args);
  21. System.out.println("=========执行后==========");
  22. return result;
  23. }
  24. }

  3、测试类

  1. public class TestCglib {
  2. public static void main(String[] args) {
  3. UserCglib cglib = new UserCglib();
  4. UserServiceImpl userServiceImpl = (UserServiceImpl) cglib.getInstance(new UserServiceImpl());
  5. userServiceImpl.addUser();
  6. }
  7. }

  4、测试结果

  1. =========执行前==========
  1. =========增加用户==========
  1. =========执行后==========

JDK动态代理和CGLIB库优点和局限:

  • JDK动态代理只能对实现了接口的类生成代理,而不能针对类。
  • CGLIB是针对类实现代理,对指定的类生成一个子类,覆盖其中的方法(继承),对于无法生成子类的类(final类),肯定是没有办法生成代理子类的。

注:静态代理、动态代理、CGlib看上去实现起来复杂,其实Spring AOP已经帮我们封装好了,我们直接拿来用就可以了。

  本文主要是为了了解 AOP 的实现原理(即基于代理)。

注2:CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。

参考:https://juejin.im/post/591d8c8ba22b9d00585007dd

参考:https://cloud.tencent.com/developer/article/1441626

参考:https://www.cnblogs.com/xiaoxiao7/p/6057724.html

JAVA AOP面向切面编程与动态代理的更多相关文章

  1. java aop面向切面编程

    最近一直在学java的spring boot,一直没有弄明白aop面向切面编程是什么意思.看到一篇文章写得很清楚,终于弄明白了,原来跟python的装饰器一样的效果.http://www.cnblog ...

  2. AOP面向切面的基石——动态代理(一)

    其实动态代理在Java里不是什么新技术了,早在java 1.2之后便通过 java.lang.reflect.InvocationHandler 加入了动态代理机制. 下面例子中,LancerEvol ...

  3. [转] AOP面向切面编程

    AOP面向切面编程 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...

  4. 【原创】Android AOP面向切面编程AspectJ

    一.背景: 在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在视频模块,要想实现对用户对监控点的实时预览和远程回放行为进行统计, ...

  5. Spring:AOP面向切面编程

    AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. AOP是软件开发思想阶段性的产物,我们比较熟悉面向过程O ...

  6. Spring Boot2(六):使用Spring Boot整合AOP面向切面编程

    一.前言 众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转.本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理. 二.何为aop ​ aop全称Aspec ...

  7. Spring 08: AOP面向切面编程 + 手写AOP框架

    核心解读 AOP:Aspect Oriented Programming,面向切面编程 核心1:将公共的,通用的,重复的代码单独开发,在需要时反织回去 核心2:面向接口编程,即设置接口类型的变量,传入 ...

  8. AOP 面向切面编程, Attribute在项目中的应用

    一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...

  9. AOP面向切面编程的四种实现

     一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...

随机推荐

  1. Show Profile

    1.是什么:是mysql提供可以用来分析当前会话中语句执行的资源消耗情况.可以用于SQL的调优的测量 2.官网:http://dev.mysql.com/doc/refman/5.7/en/show- ...

  2. maven 查找依赖的办法

    maven 你需的jar包名称 repository 比如我要做EJB,我要找jboss-j2ee.jar的Dependency 就在GOOGLE里输入 maven jboss-j2ee reposi ...

  3. easyui自学模板代码

    index.jsp源码 <%@ page language="java" contentType="text/html; charset=UTF-8" p ...

  4. hadoop2.7伪分布式搭建

    0.配置主机名 hostnamectl set-hostname spark1 1.上传hadoop-2.7.1.tar.gz文件并解压 tar -xvf hadoop-2.7.1.tar.gz 2. ...

  5. Mybatis 并发执行导致cpu占满的问题

    最近线上服务经常 出现cpu达到100%的问题,发现都是执行oracle操作的方法就没有返回.经过排查,最后定位到cpu消耗在以下方法 System.Collections.Generic.Dicti ...

  6. ES6数据结构Set、Map

    一.Set数据结构 Set是无序的不可重复的多个value的集合体,Set结构是类似于数组结构,但是Set中的值都不能重复 常用的属性和方法 size:返回set实例的成员总数 add():添加某个值 ...

  7. spring,配置文件applictionContext.xml,Mybatis mybatis.xml,springMVC spring整合springMVC mybatis

  8. ExoPlayer + 边缓存边播放

    在此基础上改动:https://www.cnblogs.com/candyzhmm/p/9957928.html private void openPlayer(String videoUrl) { ...

  9. RedisTemplate访问Redis数据结构(一)——String

    当对String数据结构进行操作时,推荐直接使用spring-data-redis提供的StringRedisTemplate,其配置如下 <bean id="stringRedisT ...

  10. 动态淀粉质(划掉)题单&简要题解

    简介 动态点分治的思想:还不太清楚诶怎么办. 大概是通过降低树高来降低每次修改和询问的复杂度吧,还可以把树上一个连通块的信息统计到一个点(重心)上.具体实现方式和普通的静态点分治没有太大的区别,只是把 ...