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 ...
随机推荐
- 一个新时代的UI设计师需要具备这些技能
如今互联网行业发展如日中天,设计师本就是稀缺人才.再加上未来也将迎接人工智能时代,未来的设计师不只像现在只是做一些网页.APP界面,还会出现更多的UI设计衍生职业.如下列举的几大类: 一.初级阶段 1 ...
- Manacher算法(马拉车)
学习博客:https://www.cnblogs.com/love-yh/p/7072161.html 首先,得先了解什么是回文串(我之前就不是很了解,汗).回文串就是正反读起来就是一样的,如“abb ...
- groovy与javah互相调用
暂时只找到这几种方法.groovy代码方便灵活.常用来写一些工具.一般都是java加入groovy代码 第一种 java中加入 groovy代码就是 Toy.groovy class Toy{ def ...
- Python的logger配制文件
1:logger.conf ############################################### [loggers] keys=root,manylog,daylog [lo ...
- 【卷土重来之C#学习笔记】(三) 类的基本概念
1.类的概述 程序的数据和功能被组织为逻辑上相关的数据项和函数的封装集合,并被称为类. 类是一个能存储数据并执行代码的数据结构. 它包含数据成员和函数成员: 数据成员:存储与类或类的实例相关数 ...
- jqGrid 将行变成超连接时浏览器解析超连接错误
1.将行变成超连接如下所示 name: , align: "center", formatter: function (cellValue, options, rowdata, a ...
- [转]使用 Razor 进行递归操作
本文转自:http://www.cnblogs.com/zbw911/archive/2013/01/10/2855025.html 做一个菜单,多级的会遇到递归的问题,打算在code中做一个递归方法 ...
- XHR的应用场景
一.简史 IE5.5最早实现XHR,需要通过ActiveXObject创建xhr实例,直到IE7才定义了XMLHttpRequest对象.IE5.5实现XHR之后,其他浏览器紧随其后实现了XHR,直接 ...
- Error creating bean with name 'com.cloud.feign.interfaces.xxxFeignClient': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalSt.PathVariable annotation was empty on
环境: Spring Cloud:Finchley.M8 Spring Boot:2.0.0.RELEASE 报错信息: Error creating bean with name 'com.clou ...
- python unix时间戳
这是第一次用着python感到怒了,从datetime转化到timestamp数值居然没有直接的函数 直接获取当前时间戳倒是方便: import time timestamp = time.time( ...