Spring Boot AOP代理

AOP 代理的两种实现:

  • jdk是代理接口,私有方法必然不会存在在接口里,因此就不会被拦截到;
  • cglib是子类,private的方法照样不会出如今子类里,也不能被拦截。

Java 动态代理。

具体有以下四步骤:html

  1. 经过实现 InvocationHandler 接口建立本身的调用处理器;
  2. 经过为 Proxy 类指定 ClassLoader 对象和一组 interface 来建立动态代理类;
  3. 经过反射机制得到动态代理类的构造函数,其惟一参数类型是调用处理器接口类型;
  4. 经过构造函数建立动态代理类实例,构造时调用处理器对象做为参数被传入。

GCLIB代理

cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它能够在运行期扩展Java类与实现Java接口。java

  • cglib封装了asm,能够在运行期动态生成新的class(子类)。
  • cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。

原理区别:

java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,经过修改其字节码生成子类来处理。git

  1. 若是目标对象实现了接口,默认状况下会采用JDK的动态代理实现AOP
  2. 若是目标对象实现了接口,能够强制使用CGLIB实现AOP
  3. 若是目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

在Spring Boot中咱们能够经过配置文件制定代理类型。github

#开启对AOP的支持
spring.aop.auto=true
#设置代理模式 true(cglib) false(java JDK代理)
spring.aop.proxy-target-class=true

Spring Boot事务默认是使用的cglib代理,能够经过上面的方式去指定代理模式。spring

源码:https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases函数

spring-boot-student-data-jpa-transaction 工程spring-boot

参考: http://www.cnblogs.com/fenglie/articles/4097759.html性能

相关文章
相关标签/搜索