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 ...
随机推荐
- c#字典排序
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- pycharm激活码------2017.11.之前有效
BIG3CLIK6F-eyJsaWNlbnNlSWQiOiJCSUczQ0xJSzZGIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...
- PHP通过映射类查找类所在文件
$reflectObj = new ReflectionClass(类名); $file_name = $reflectObj->getFileName(); var_dump($file_na ...
- Java中使用MongoUtils对mongodb数据库进行增、删、查、改
本文主要介绍在java应用中如何使用MongoUtils工具类对 mongodb进行增.删.查.改操作. 一.配置 1.将 common.jar库引入到项目环境中: (源代码:https://gite ...
- 服务器LIUNX之如何解决矿机问题
点进来的基本都是遇到liunx变矿机的小伙伴吧(cpu运载300%) 卡的连终端都很难打开 开下来之后提示 大意是, 到xxx网站给钱了事, 不过基本这个网站基本也上不去, 要么是暴力破解, 要么是通 ...
- php自建静态博客步骤
进入博客目录新建index.php页面 <?php require “XXXX/index.html”;//引入html页面 是否能进入localhost/xxx/index.php 注意,ph ...
- git如何进行远程分支切换
git如何进行远程分支切换 git上查看远程分支命令: git branch -a 例如: 然后我想切换到daily/1.0.0远程分支:前提是必须要创建一个本地分支,并让它和远程分支进行关联,gi ...
- javascript实现数据结构: 串的块链存储表示
和线性表的链式存储结构相类似,也可采用链式方式存储串值.由于串结构的特殊性--结构中的每个数据元素是一个字符,则用链表存储串值时,存在一个“结点大小”的问题,即每个结点可以存放一个字符,也可以存放多个 ...
- .NET开源工作流RoadFlow-表单设计-子表
子表即明细表 从表:与主表对应在子表. 从表主键:从表的主键. 主表字段:主表中与从来关联的字段,一般为主表的主键. 与主表关联字段:从表中与主表关联的字段. 选择之后即可在下面从表字段列表中设置每个 ...
- JSTL核心库
1 out和set(重点) out <c:out value=”aaa”/> 输出aaa字符串常量 <c:out value=”${aaa}”/> 与${aaa}相同 < ...