Spring学习之设计模式,动态代理和gclib动态代理
传统的代理模式是静态代理,也就是在方法区域中写入方法。
而动态代理的作用是,不修改实现类的代码,能够在代码的前后或者抛出异常的前后执行某个方法。
动态代理类的实现
//Interface
public interface UserServiceInter {
void save();
void delete();
void modify();
void search();
}
//entity
public class UserService implements UserServiceInter{
public void save(){
System.out.println("保存");
} public void delete(){
System.out.println("删除");
} public void modify(){
System.out.println("修改");
} public void search(){
System.out.println("查询");
}
}
//代理类以及测试类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class UserServiceProxyFactory implements InvocationHandler{
private UserService us; public UserServiceProxyFactory(UserService us) {
this.us = us;
} public UserServiceInter getUserServiceProxy(){
UserServiceInter us=(UserServiceInter) Proxy.newProxyInstance(UserService.class.getClassLoader(),
UserService.class.getInterfaces() , this);
return us;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before invoke");
Object invoke=method.invoke(us, args);
System.out.println("after invoke");
return invoke;
} public static void main(String[] args) {
UserServiceProxyFactory factory=new UserServiceProxyFactory(new UserService());
UserServiceInter us=factory.getUserServiceProxy();
us.delete();
}
}
运行结果:

注意:Proxy.newInsatance()的三个参数,第一个是实现类或者Interface的类加载器,第二个是实现类的Interface数组,第三个是Invocation接口的实现类
接收使用实现类的Interface接口进行接收。
CGlib动态代理
import java.lang.reflect.Method; import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
//spring整合了cglib的Enhancer类,cglib代理实质是一个继承代理
public class UserServiceProxyFactory2 implements MethodInterceptor{
public UserServiceInter getUserServiceProxy(){
Enhancer en=new Enhancer();//该类帮我们生成代理对象
en.setSuperclass(UserService.class);//代理类
en.setCallback(this);//代理做什么
UserServiceInter us=(UserServiceInter) en.create();//创建代理对象
return us;
} @Override
public Object intercept(Object proxyobj, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable {
System.out.println("before");
//调用原有方法
Object ret=methodProxy.invokeSuper(proxyobj, arg);
System.out.println("after");
return ret;
}
public static void main(String[] args) {
UserServiceInter us=new UserServiceProxyFactory2().getUserServiceProxy();
us.delete();
}
}
Spring学习之设计模式,动态代理和gclib动态代理的更多相关文章
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别. 我还是喜欢基于Schema风格的Spring事务管理,但也有很多人在用基于@Tras ...
- Spring -- <tx:annotation-driven>注解基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)的区别。
借鉴:http://jinnianshilongnian.iteye.com/blog/1508018 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional ...
- Spring <tx:annotation-driven>注解 JDK动态代理和CGLIB动态代理 区别。
基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别. 我还是喜欢基于Schema风格的Spring事务管理,但也有很多人在用基于@Tras ...
- java的静态代理、jdk动态代理和cglib动态代理
Java的代理就是客户端不再直接和委托类打交道,而是通过一个中间层来访问,这个中间层就是代理.使用代理有两个好处,一是可以隐藏委托类的实现:二是可以实现客户与委托类之间的解耦,在不修改委托类代码的情况 ...
- 代理模式之静态代理,JDK动态代理和cglib动态代理
代理模式,顾名思义,就是通过代理去完成某些功能.比如,你需要购买火车票,不想跑那么远到火车站售票窗口买,可以去附近的火车票代售点买,或者到携程等第三方网站买.这个时候,我们就把火车站叫做目标对象或者委 ...
- AOP的底层实现-CGLIB动态代理和JDK动态代理
AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础.它是一种面向切面编程的思想.关于AOP的基础知识,相信多数童鞋都已经了如指掌,我们就略过这部分,来 ...
- JDK动态代理和CGLib动态代理简单演示
JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...
- jdk动态代理和cglib动态代理底层实现原理详细解析(cglib动态代理篇)
代理模式是一种很常见的模式,本文主要分析cglib动态代理的过程 1. 举例 使用cglib代理需要引入两个包,maven的话包引入如下 <!-- https://mvnrepository.c ...
- Spring 静态代理+JDK动态代理和CGLIB动态代理
代理分为两种:静态代理 动态代理 静态代理:本质上会在硬盘上创建一个真正的物理类 动态代理:本质上是在内存中构建出一个类. 如果多个类需要进行方法增强,静态代理则需要创建多个物理类,占用磁盘空间.而动 ...
随机推荐
- heigth innerheigt outerheight详解
height() :height innerHeight(): height + paddingouterHeight(): height + padding + border outerHeight ...
- Android ConstraintLayout 约束布局属性
常用方法总结 layout_constraintTop_toTopOf // 将所需视图的顶部与另一个视图的顶部对齐. layout_constraintTop_toBottomOf // 将所需视图 ...
- 集成ShareSdk一键分享和第三方登录
在Mob官网http://mob.com/注册,创建应用,下载SDK,申请APP_key 根据官网开发指南导入SDK到你的项目中: 在assets/ShareSDk.xml中修改你的APP_key p ...
- Jenkins发布回滚方案
Jenkins回滚可以通过每次发布从主干打tag,然后发布的时候发tag,比如tag, v1, v2,v3 如果我发布了v3,想要回滚回v2,直接在Jenkins中选择v2的tag地址重新构建就可以回 ...
- java:JQuery(声明,JQ和JS对象的区别,prop,attr,addClass,offset,trigger,dblclick和change事件,hide,show,toggle,slideUp,slideDown,slideToggle,三种选择器,标签的获取,三张图片的放大与缩小)
1.JQuery: jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计 的宗旨是“ ...
- node递归批量重命名指定文件夹下的文件
1.用法:将js内容拷到一文件中,命名为batchRename.js: 该文件可以放到任何你想更改文件名的文件夹目录,然后dos(或 linux 终端)进入该文件夹,然后执行node batchRe ...
- jmeter监控服务器性能(windows系统)
一.jmeter安装插件 前两个是jmeter插件,安装到本地的jmeter文件夹下第三个是放到服务器里的 jmeter插件官网地址:https://jmeter-plugins.org/ [我分享的 ...
- 安装opencv3.3.0碰到的问题及解决方法
出处:http://osask.cn/front/ask/view/258965 CMakeError.log Compilation failed: source file: '/home/jhro ...
- 写一个比较全的进制转换函数--ic
//写一个比较全的进制转换函数-----未完成 #include <stdio.h> //D进制转换后 (比如10-2进制) 结果可能会很大 需要很长的字符串来存 #include < ...
- 微信小程序开发(二)----- 云开发
1.概念 微信小程序的云开发是腾讯云与微信团队深度合作推出的一个全新的小程序的解决方案,它提供了云函数.云数据库与云存储这三大基础能力支持,随着云开发的出现,小程序的开发者可以将服务端的部署和运营的环 ...