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 ...
随机推荐
- Java基础19-封装、方法重载、构造方法(构造函数)
1.封装 封装就是把不想或者不该告诉别人的东西隐藏起来,把可以告诉别人的公开 做法:修改属性的访问权限来限制对属性的访问.并为每一个属性创建一对取值方法和赋值方法,用于对这些属性的访问 class D ...
- 51nod 1245 Binomial Coefficients Revenge
Description C(M,N) = M! / N! / (M - N)! (组合数).给出M和质数p,求C(M,0), C(M,1)......C(M,M)这M + 1个数中,有多少数不是p的倍 ...
- bzoj 5302: [Haoi2018]奇怪的背包
Description Solution 首先 \(v_1,v_2,v_3...v_n,P\) 能够构成的最小数是 \(gcd(P,v_1,v_2,v_3...v_n)\) 然后 \(gcd(P,v_ ...
- iis6、iis7、apache设置mime类型
1.IIS6添加方法. 打开iis,展开网站,右键要设置的站点--属性.找到“http头”选项卡--mime类型 进行设置添加. 截图以.ipa mime类型举例. 2.IIS7(iis7.5.iis ...
- jquery的$.getScript在IE下的缓存问题
jquery的$.getScript在IE下的缓存问题
- L1-002 打印沙漏 (20 分)
L1-002 打印沙漏 (20 分) 方法:清晰思路,纸上写出实例,注意循环使用 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * ** ...
- Scala 知识点掌握1
Scala知识点巩固 1.Scala简介 Scala是一门面向对象和面向函数的编程语言,是一门静态编程语言,如 Java Scala(变量类型在编译阶段确定):源码文件需要基于 JVM 运行的. 动态 ...
- vue 路由权限
import Vue from 'vue' import Router from 'vue-router' import HelloWorld from '@/components/HelloWorl ...
- mui 窗体切换
手机实现窗体切换 1.在5+环境下(即H5app) 先初始化: mui.init({ subpages:[{ url:"page1.html",//子页面HTML地址,支持本地地址 ...
- 任务六:通过HTML及CSS模拟报纸排版
任务目的 深入掌握CSS中的字体.背景.颜色等属性的设置 进一步练习CSS布局 任务描述 参考 PDS设计稿(点击下载),实现页面开发,要求实现效果与 样例(点击查看) 基本一致 页面中的各字体大小, ...