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.需要获取到被代理人的 ...
随机推荐
- CSDN不登陆看博文
做前端的朋友说,手动改太Low,给了段JS代码: javascript: void((function() {var divElement = document.getElementById('art ...
- AtCoder Grand Contest #026 C - String Coloring
Time Limit: 3 sec / Memory Limit: 1024 MB Score : 600600 points Problem Statement You are given a st ...
- poj1011 Sticks[剪枝题]
https://vjudge.net/problem/POJ-1011 此题很重要.★★★ 很欢(e)乐(xin)的一道搜索剪枝题..poj数据还是太水了,我后来想不出来剪枝方法了,就加了句掐了时间语 ...
- bzoj 1004 Cards & poj 2409 Let it Bead —— 置换群
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1004 关于置换群:https://www.cnblogs.com/nietzsche-oie ...
- POJ2253(djkstra求最长最短边)
Frogger Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 32257 Accepted: 10396 Descrip ...
- Ubuntu 获得超级用户权限
sudo passwd root 首先要先输入当前用户的密码,再在"输入新的UNIX密码"后面输入你想要设置的 root 密码即可,然后就可以切换到 super user 了: $ ...
- Day04:函数参数、对象、嵌套、闭包函数和装饰器
上节课复习: 1.什么是函数 函数就是具备某一功能的工具 2.为何用函数 1.程序的组织结构和可读性 2.减少代码冗余 3.扩展性强 ...
- 用mapreduce实现从hbase导出到hdfs,实现一个工具类,能够支持任意表 任意列 任意路径导出,并且支持表头
分析: 1.由于是任意列 任意表 任意路径,我们很容易想到是参数传入,参数传入后怎么去获得参数,根据我们以往的经验就是通过args[]来获取,但是在mapper或者是reducer中,我们不能直接将参 ...
- MYSQL学习二 关于左连接
工作中有如下的SQL, 针对A.ID ='abcdefg', left join B和C两个表,来查找其他信息.就算是B和C中没有任何满足条件的记录,最后结果也肯定不是空.因为A.ID ='abc ...
- 1.改变项目 动态库、静态库属性。 2.使用运行库 /MD、/MT、/LD说明
/MD./MT./LD(使用运行库) 有关 C 运行库以及使用 /clr(公共语言运行时编译) 进行编译时要使用哪些库的更多信息,请参见 CRT 库功能. 传递给链接器的给定调用的所有模块都必须使用相 ...