SPRING代理模式
1.静态代理
主题对象:Student
public interface Student {
public String add();
}
目标对象:RealStudent
public class RealStudent implements Student {
public String add() {
System.out.println("add Ok");
return null;
}
}
代理对象:ProxStudent
public class ProxStudent implements Student {
//对象间交互
private Student realStudent;
public Student getRealStudent() {
return realStudent;
}
public void setRealStudent(Student realStudent) {
this.realStudent = realStudent;
this.realStudent=realStudent;
}
public String add() {
System.out.println("事务已经开启!");
return realStudent.add();
}
}
单测
//静态代理
@Test
public void test01(){
//真实主题对象
Student student=new RealStudent();
//代理对象
ProxStudent proxStudent=new ProxStudent(); proxStudent.setRealStudent(student); proxStudent.add(); }
2.JDK动态代理
接口:IUserDAO
public interface IUserDAO {
public String add();
public String edit();
}
类:UserDAOImpl
public class UserDAOImpl implements IUserDAO {
public String add() {
System.out.println("add");
return "add";
}
public String edit() {
System.out.println("edit");
return "edit";
}
}
单测
//JDK动态代理
@Test
public void test02(){
final IUserDAO dao=new UserDAOImpl();
IUserDAO proxy=(IUserDAO) Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("事务已经开启");
method.invoke(dao,args);
return null;
}
});
//代理对象 add() edit()
proxy.add();
proxy.edit(); }
3.CGLIB动态代理
public class UserService {
public void dalete() {
System.out.println("dalete OK");
}
}
单测 方式一
//CGLIB 动态代理 一
@Test
public void test03(){ final UserService service=new UserService(); Enhancer enhancer =new Enhancer();
//在内存中构建业务类的子类
enhancer.setSuperclass(service.getClass());
enhancer.setCallback(new org.springframework.cglib.proxy.InvocationHandler() {
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
System.out.println("事务已经开启");
method.invoke(service,objects);
return null;
}
});
UserService proxy=(UserService)enhancer.create();
proxy.dalete();
}
单测 方式二
//CGLIB 动态代理 二
@Test
public void test04(){
final UserService service=new UserService(); Enhancer enhancer =new Enhancer();
//在内存中构建业务类的子类
enhancer.setSuperclass(service.getClass());
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("事务已经开启");
methodProxy.invoke(service,objects);
return null;
}
});
UserService proxy=(UserService)enhancer.create();
proxy.dalete(); }
SPRING代理模式的更多相关文章
- Spring代理模式及AOP基本术语
一.代理模式: 静态代理.动态代理 动态代理和静态代理区别?? 解析:静态代理需要手工编写代理类,代理类引用被代理对象. 动态代理是在内存中构建的,不需要手动编写代理类 代理的目的:是为了在原有的方法 ...
- Spring 代理模式及AOP基本术语
一.代理模式: 静态代理.动态代理 动态代理和静态代理区别?? 解析:静态代理需要手工编写代理类,代理类引用被代理对象. 动态代理是在内存中构建的,不需要手动编写代理类 代理的目的:是为了在原有的方法 ...
- Spring代理模式(jdk动态代理模式)
有动态代理和静态代理: 静态代理就是普通的Java继承调用方法. Spring有俩种动态代理模式:jdk动态代理模式 和 CGLIB动态代理 jdk动态代理模式: 代码实现: 房东出租房子的方法(继承 ...
- Spring代理模式(CGLIB动态代理模式)
jdk动态代理和CGLIB动态代理 没什么太大的区别,CGLIB动态代理不需要接口,但是需要导入jar包. 房东出租房子的方法: package com.bjsxt.proxy2; public cl ...
- spring代理模式 service远程调用,插件执行
最近,研究了一下平台远程调用的过程,和service层插件执行的原理,记录一下. 1.远程service调用过程 首先看一下类的继承结构 封装调用处理过程 封装service调用接口 封装servic ...
- Spring AOP /代理模式/事务管理/读写分离/多数据源管理
参考文章: http://www.cnblogs.com/MOBIN/p/5597215.html http://www.cnblogs.com/fenglie/articles/4097759.ht ...
- 代理模式及其在spring与struts2中的体现
代理模式 代理模式有三个角色组成: 1.抽象主题角色:声明了真实主题和代理主题的共同接口. 2.代理主题角色:内部包含对真实主题的引用,并且提供和真实主题角色相同的接口. 3.真实主题角色:定义真实的 ...
- Spring框架_代理模式(静态代理,动态代理,cglib代理)
共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下: ...
- spring设计模式_代理模式
代理模式应该是Spring核心设计模式之一了 先说下代理模式特性: 1.有代理人和被代理人 2.对于被代理的人来说,这件事情是一定要做的,但是我又不想做,所有就找代理人来做. 3.需要获取到被代理人的 ...
随机推荐
- kettle监控销售人员当月每天任务完成率_20161107周一
1.上面是目标表,其中激活客户数为当月每天之前30天未下单的客户 2.写SQL SELECT a.销售员,c.当月销售确认额,a.当月订单额,b.当月首单数,b.当月激活数, a1,b.b1,b.c1 ...
- javacpp-FFmpeg系列补充:FFmpeg解决avformat_find_stream_info检索时间过长问题
javacpp-ffmpeg系列: javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片 javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转 ...
- 12 Vue学习 项目技术栈
vue2 + vuex + vue-router + webpack + ES6/7 + less + element-ui 1:vuex: Vuex 是一个专为 Vue.js 应用程序开发的状态管理 ...
- httpd服务相关实验
实验环境: CentOS6.8 1.连接测试: 在/etc/httpd/conf/httpd.conf telnet 172.16.252.242 80 GET /index.html HTTP/1. ...
- MySql介绍及优化(1)
mysql 数据库 1.是关系型数据库: 2.体积小.支持多处理器.开源.免费 3.在 Internet 中小型网站中的使用率尤其高 mysql 数据库开发常见问题及优化 一.库表设计 1.1 引擎选 ...
- matlab下的caffe接口配置(Windows)
本文基于大部分网上方法 http://blog.csdn.net/d5224/article/details/51916178,外加一点自己的个人实际配置经历,环境变量在配置后尽管显示正确并且重启多次 ...
- windows7无法启动Telnet服务,出现…
windows7无法启动Telnet服务,出现错误1068 2012 年 03 月 16 日 在[控制面板--程序--打开或关闭Windows功能]中开启telnet服务器和客户端后,在运行窗口中输入 ...
- java之字符串转换
参考http://how2j.cn/k/number-string/number-string-parse/317.html 数字转字符串 方法1: 使用String类的静态方法valueOf 方法2 ...
- js中“||”和“&&”的高级用法
例1:用于赋值&&:从左往右依次判断,当当前值为true则继续,为false则返回此值(是返回未转换为布尔值时的原值哦)|| : 从左往右依次判断,当当前值为false则继续,为tru ...
- gin-swagger包Api文档生成, Post请求参数无法接收, 问题修复。
Bug描述 FormData方式下,任意参数类型都只生成file参数类型. 问题重现 问题代码在这一行 github.com\swaggo\swag\operation.go : 131 line c ...