动态代理(CGLIB实现)
CGLIB(Code Generation Library)是一个开源项目。可以直接对类进行增强,而不需要像JDK的动态代理,需要增强的类必须实现某接口
在使用Spring框架时,因为Spring框架中core包中引入了cglib所以如果想通过cglib来实现动态代理,不需要专门的导cglib的jar包。
创建代理工厂时,必须得实现MethodInterceptor接口,因为通过cglib创建的代理对象在调方法时会默认执行intercept方法,通过该方法增加目标对象方法。
public class CglibProxyFactory implements MethodInterceptor {
//通过构造方法,把目标对象传进来
private Object target;
public CglibProxyFactory(Object target) {
this.target = target;
}
//得到代理对象
public Object getProxyObject() {
Enhancer enhancer = new Enhancer(); //实例化cglib代理增强器-
enhancer.setSuperclass(target.getClass()); //设置目标的类:通过目标类对象来生成代理子对象
enhancer.setCallback(this); //回调方法 参数:回调的对象
return enhancer.create(); // 通过增强器得到代理对象
}
//增强目标对象方法
@Override
public Object intercept(
Object proxy, //代理对象
Method method, //目标对象的方法
Object[] args, //需要增强的方法的参数
MethodProxy proxyMethod //代理对象的方法继承目标对象的方法(method)
) throws Throwable {
System.out.println("前置增强");
//直接调用目标对象的方法(目标方法执行方式1)
Object value = method.invoke(target, args);
//调用代理代理对象的父类方法,相当于间接调用目标对象的方法(目标方法执行方式2)
Object value = proxyMethod.invokeSuper(proxy, args);
System.out.println("后置增强");
return value;
}
}
动态代理(CGLIB实现)的更多相关文章
- 获取JDK动态代理/CGLIB代理对象代理的目标对象。
问题描述:: 我现在遇到个棘手的问题,要通过spring托管的service类保存对象,这个类是通过反射拿到的,经过实验发现这个类只能反射取得sservice实现了接口的方法,而extends类的方法 ...
- Proxy 代理模式 动态代理 cglib MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Java动态代理 cglib
代理模式:为某些对象提供代理以实现对这个对象的访问. 对一个对象进行访问控制的原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化. 一般包括以下组件: 被代理者接口:提供被代理者的访问途径. ...
- 动态代理CGlib实例
1.委托类: package 动态代理2; //需要对这个类进行增强 public class UserService { public void create() { System.out.prin ...
- MyBatis之反射技术+JDK动态代理+cglib代理
一.反射 引用百度百科说明: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功 ...
- Java的三种代理模式:静态代理/JDK动态代理/Cglib动态代理
1.静态代理:需要定义接口或者父类,目标对象与代理对象均实现同一接口或继承同一父类. 2.JDK动态代理:需要目标对象实现一个接口,通过动态反射的机制,生成代理对象,实现同一个接口 3.Cglib动态 ...
- 动态代理 JDK动态代理 CGLIB代理
代理模式:代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的索引,实际执行时通过调用代理类的方法.实际执行的是被代理类的方法. 而AOP,是通过动态代理实现的. 一.简单来说: JD ...
- Proxy 代理模式 动态代理 CGLIB
代理的基本概念 几个英文单词: proxy [ˈprɒksi] n. 代理服务器:代表权:代理人,代替物:委托书: invoke [ɪnˈvəʊk] vt. 乞灵,祈求:提出或授引-以支持或证明:召鬼 ...
- 静态代理,动态代理,Cglib代理详解
一.静态代理 新建一个接口 定义一个玩家方法: package com."".proxy.staticc; public interface Iplayer { public vo ...
- java 静态代理 JDK动态代理 Cglib动态代理
下面以一个简单的银行账户为例讲述讲述动态代理. 设计一个银行账户类,包含用户的账户余额,实现查询和更新余额功能 这个系统用了一段时间,有客户要求对账说账户余额给弄错了?因为上面没有存取款记录,最后银行 ...
随机推荐
- eclipse cut copy paste plugin
The Cut Copy Paste Plus plug-in enhances the standard Cut, Copy and Paste commands in Eclipse IDE. W ...
- less gradient-vertical 方法的实现
// Vertical gradient using CSS where possible, and base64-encoded SVG for IE9 (enables use of this i ...
- Excel数据转化为sql脚本
在实际项目开发中,有时会遇到客户让我们把大量Excel数据导入数据库的情况.这时我们就可以通过将Excel数据转化为sql脚本来批量导入数据库. 1 在数据前插入一列单元格,用来拼写sql语句. 具体 ...
- ubuntu ibus&language 启动失败
[ubuntu ibus&language 启动失败] 版本:ubuntu 10.04 现像:language support & ibus 无法启动,导致无法使用中文输入法 原因:l ...
- 118. Pascal's Triangle (Array)
Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Retu ...
- Bean标签的常用属性
-----------------siwuxie095 Bean 标签的常用属性 1.id 属性:Bean 的唯一标识名,必须以字母开头,且不能 包含特殊字符 2.class 属性:用来定义类的全限定 ...
- 单词搜索 II · Word Search II
[抄题]: 给出一个由小写字母组成的矩阵和一个字典.找出所有同时在字典和矩阵中出现的单词.一个单词可以从矩阵中的任意位置开始,可以向左/右/上/下四个相邻方向移动. 给出矩阵: doafagaidca ...
- 企业招聘:UX设计师需要满足他们哪些期望?
以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 为了确定2017年最有价值的用户体验技能和特质,我特地参考了150多份工作要求.最后,得出了以下 ...
- gradle使用总结
###打包时跳过单元测试
- mongo学习- 副本集 大多数原则
副本集中有一个重要的概念“大多数”,意思是说,选择主节点需要大多数决定(本人亲自做了实验) 步骤: 1.开启副本集(如果没有配置好 副本集的 亲参考我的上篇文章 https://www.cnblog ...