Spring 的AOP底层实现技术:JDK和CGLIB动态代理
Spring 的AOP实现技术之JDK的动态代理技术实例:
接口:IUserService
(Spring的AOP是动态AOP,实现技术:JDK提供的动态代理和cglib代理,
cglib它可以为没有实现接口的类做代理,也可以为接口类做代理.如果有接口,使用JDK动态代理,如果没有,使用cglib动态代理.)
利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理
public interface IUserService {
public void login(String username,String password);
public void regist();
}
实现类
public class UserServiceImpl implements IUserService {
@Override
public void login(String username,String password) {
System.out.println("登录......");
}
@Override
public void regist() {
System.out.println("注册.......");
}
}
代理工厂
//使用jdk的proxy完成动态代理工具
public class JDKProxyFactory implements InvocationHandler{
//创建目标对象,将传进来的对象赋值给本类对象就代理.
private Object target;
public JDKProxyFactory(Object target){
this.target=target;
};
//通过目标对象创建代理对象
public Object createProxy(){
//使用Proxy完成代理对象的创建
//得到目标对象的classLoder
ClassLoader loader = target.getClass().getClassLoader();
//得到目标对象的interfaces
Class<?>[] interfaces = target.getClass().getInterfaces();
//实现InvocationHandler接口,this就是创建代理对象的
return Proxy.newProxyInstance(loader, interfaces, this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//在代理实例上处理方法调用并返回
//proxy是代理对象,method是调用的方法的method方法,args是调用的方法的参数
System.out.println("日志文件");
//target=UserServiceImpl--目标对象
return method.invoke(target, args);
}
测试类
public class ProxyTest {
@Test
public void test1(){
//创建目标对象
IUserService userService = new UserServiceImpl();
//创建代理对象
JDKProxyFactory factory = new JDKProxyFactory(userService);
IUserService userServiceProxy = (IUserService) factory.createProxy();
userServiceProxy.login("Tom","");}}
Spring 的AOP实现技术之CGLIB的动态代理技术实例:
CGLIB包底层是使用一个小而快的字节码处理框架ASM
接口IUserService
public interface IUserService {
public void login(String username,String password);
public void regist();
}
实现类UserService
public class UserServiceImpl /*implements IUserService*/ {
//@Override
public void login(String username,String password) {
System.out.println("登录......");
}
//@Override
public void regist() {
System.out.println("注册.......");
}
}
CglibProxyFactory 代理工厂
public class CglibProxyFactory implements MethodInterceptor {
//得到目标函数
private Object target;
//使用构造方法传递目标对象
public CglibProxyFactory(Object target){
this.target=target;
}
//创建代理对象
public Object createProxy(){
//1.创建enhancer
Enhancer enhancer = new Enhancer();
//2.传递目标对象
enhancer.setSuperclass(target.getClass());
//3.设置回调参数(相当于Invocationhandler)
enhancer.setCallback(this);
return enhancer.create();
}
@Override
//增强目标对象
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
//在代理实例上处理方法调用并返回
System.out.println("执行目标方法前");
Object result =method.invoke(target, args);
System.out.println("执行目标方法后");
return result;
测试类
public class CglibTest {
@Test
public void test1(){
//创建目标
UserServiceImpl userSerice = new UserServiceImpl();
//创建代理类,传递目标对象
CglibProxyFactory factory= new CglibProxyFactory(userSerice);
//生成IUserService的代理类
UserServiceImpl userSericeproxy = (UserServiceImpl) factory.createProxy();
userSericeproxy.login("tom", "");
}
Spring 的AOP底层实现技术:JDK和CGLIB动态代理的更多相关文章
- Spring源码剖析5:JDK和cglib动态代理原理详解
AOP的基础是Java动态代理,了解和使用两种动态代理能让我们更好地理解 AOP,在讲解AOP之前,让我们先来看看Java动态代理的使用方式以及底层实现原理. 转自https://www.jiansh ...
- Spring AOP中的JDK和CGLib动态代理哪个效率更高?
一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理, ...
- spring框架中JDK和CGLIB动态代理区别
转载:https://blog.csdn.net/yhl_jxy/article/details/80635012 前言JDK动态代理实现原理(jdk8):https://blog.csdn.net/ ...
- 动态代理的两种方式,以及区别(静态代理、JDK与CGLIB动态代理、AOP+IoC)
Spring学习总结(二)——静态代理.JDK与CGLIB动态代理.AOP+IoC 目录 一.为什么需要代理模式 二.静态代理 三.动态代理,使用JDK内置的Proxy实现 四.动态代理,使用cg ...
- Spring框架中的JDK与CGLib动态代理
JDK和CGLib动态代理区别 JDK动态代理:利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类, 在调用具体方法前调用InvokeHandler ...
- 【java高级编程】JDK和CGLIB动态代理区别
转载:https://blog.csdn.net/yhl_jxy/article/details/80635012 前言 JDK动态代理实现原理(jdk8):https://blog.csdn.net ...
- JDK、CGlib动态代理详解
Java动态代理之JDK实现和CGlib实现(简单易懂) 一 JDK和CGLIB动态代理原理 1.JDK动态代理 利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生 ...
- JDK和CGLIB动态代理原理
1.JDK动态代理利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类, 在调用具体方法前调用InvokeHandler来处理. 2.CGLiB动态代 ...
- JDK和CGLIB动态代理原理区别
JDK和CGLIB动态代理原理区别 https://blog.csdn.net/yhl_jxy/article/details/80635012 2018年06月09日 18:34:17 阅读数:65 ...
随机推荐
- js动态实现时分秒
<div id="time" style="color: #96C2DD;</div> <script type="text/ ...
- rsync 问题总结
Rsync服务常见问题汇总讲解:==================================1. rsync服务端开启的iptables防火墙 [客户端的错误] No route to ...
- Spark-HBase集成错误之 java.lang.NoClassDefFoundError: org/htrace/Trace
在进行Spark与HBase 集成的过程中遇到以下问题: java.lang.IllegalArgumentException: Error while instantiating 'org.apac ...
- 【卷土重来之C#学习笔记】(一)c#文章导航目录
[卷土重来之C#学习笔记](一)c#文章导航目录 [卷土重来之C#学习笔记](二)c#编程概述 [卷土重来之C#学习笔记](三)类型.存储.对象 [卷土重来之C#学习笔记](四)类的基本概念 [卷土重 ...
- mysql 索引、查询优化
查询计划Explain mysql查询过程中,如若想了解当前sql的执行计划,可以通过explain your_sql的方式查看,具体可以参考mysql官方解释:https://dev.mysql.c ...
- Linux VFS机制简析(二)
Linux VFS机制简析(二) 接上一篇Linux VFS机制简析(一),本篇继续介绍有关Address space和address operations.file和file operations. ...
- SpringSecurity 3.2入门(3)单用户登录
1.增加web.xml文件配置如下 <!-- 获取Spring Security session的生命周期,这个监听器会在 session 创建和销毁的时候通知 Spring Security ...
- java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ 解决方案
//第一个异常 Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysq ...
- iDempiere 使用指南 库存出入库研究
Created by 蓝色布鲁斯,QQ32876341,blog http://www.cnblogs.com/zzyan/ iDempiere官方中文wiki主页 http://wiki.idemp ...
- GridView简单使用
如图是效果图 今天看到看到这个代码发现一个问题 就是我的listView的布局不对 我的GridView的 android:layout_height="wrap_content&quo ...