`
dou_shini8820
  • 浏览: 78164 次
社区版块
存档分类
最新评论

SpringAop基础之静态代理和动态代理

阅读更多

java动态代理常用于做权限控制,细粒度权限如对方法的操作是否有权限,如果在每个方法前都判断一下用户是否有权限是非常麻烦的,因此用代理实现给每个方法前自动加上判断的功能。使用jdk的proxy类来实现代理。 

 

一、静态代理:

/**
 * 这是真是对象要继承的抽象类
 * @author 罗辉
 * @time 2013-4-15下午10:21:55
 */
public abstract class subject {
	public abstract void rentHouse();
}

 

/**
 * 真实对象继承抽象类,有一个方法
 * @author 罗辉
 * @time 2013-4-15下午10:26:12
 */
public class RealSubject extends subject {
	@Override
	public void rentHouse() {
		System.out.println("租房子");
	}
}

 

 

/**
 * 代理类也有一个相同的方法,但是他实际上确是通过真实类realsubject类来实现的
 * 并可以在方法前后做一些自己的操作
 * @author 罗辉
 * @time 2013-4-15下午10:24:25
 */
public class ProxySubject {
	public void rentHouse() {
		premethod();
		RealSubject realSubject=new RealSubject();
		realSubject.rentHouse();
		postmethod();
	}
	private void premethod(){
		System.out.println("房子租出去之前要做的事");
	}
	private void postmethod(){
		System.out.println("房子租出去之后要做的事");
	}
}

 

/**
 * 静态代理
 * 通过代理类来操作真实类
 * 但是每个真实类要对应一个代理类,导致类数量的膨胀
 * @author 罗辉
 * @time 2013-4-15下午10:43:56
 */
public class Client {
	public static void main(String[] args) {
		ProxySubject proxySubject = new ProxySubject();
		proxySubject.rentHouse();
	}
}

 

二、动态代理:

 

总结使用动态代理的步骤:
1、创建一个要被代理的真实类,以及该类所实现的接口
2、创建一个实现了InvocationHandler接口的代理类,它必须实现invoke方法
3、通过Proxy的静态方法newInstance(ClassLoader c,Class[] interfaces,InvocationHandler h)来创建一个代理
4、通过代理来调用方法

 

 

/**
 * 真实类要实现的接口
 * @author 罗辉
 * @time 2013-4-15下午10:52:03
 */
public interface Subject {
	public void rentHouse();
}

 

/**
 * 真实类
 * @author 罗辉
 * @time 2013-4-15下午10:52:32
 */
public class RealSubject implements Subject {
	public void rentHouse() {
		System.out.println("租房子");
	}
}

 

/**
 * 代理类,需要传入一个真实对象,实现了InvocationHandler的接口
 * 代理类肯定是要通过真实对象来处理方法的
 * @author 罗辉
 * @time 2013-4-15下午10:35:55
 */
public class ProxySubject implements InvocationHandler{
	private Object realObject;
	public ProxySubject(Object realObject) {
		this.realObject=realObject;
	}
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		return method.invoke(realObject, args);
	}
}

 

 

/**
 * 动态代理,这是springAop的一种实现方法,另外一种使用第三方的cglib
 * 通过代理类来获取一个InvocationHandler
 * 如何获得代理类?使用Proxy的newProxyInstance动态创建一个代理类(一个代理Proxy可以为多个真实类服务),然后由代理类执行方法
 * 第二个参数是要实现哪些接口,可以实现多个
 * @author 罗辉
 * @time 2013-4-15下午10:39:29
 */
public class Client {
	public static void main(String[] args) {
		//在实际情况下,我们是通过spring的配置文件来获取realsubject的定义的,在此假设new一个出来
		RealSubject realSubject = new RealSubject();
		InvocationHandler handler = new ProxySubject(realSubject);
		Class<?> clazz = realSubject.getClass();
		Subject subject = (Subject) Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), handler);
		subject.rentHouse();
	}
}

 

0
3
分享到:
评论
1 楼 rlplyyrb 2013-04-18  

相关推荐

    pre_o_1csdn63m9a1bs0e1rr51niuu33e.a

    pre_o_1csdn63m9a1bs0e1rr51niuu33e.a

    matlab建立计算力学课程的笔记和文件.zip

    matlab建立计算力学课程的笔记和文件.zip

    FT-Prog-v3.12.38.643-FTD USB 工作模式设定及eprom读写

    FT_Prog_v3.12.38.643--FTD USB 工作模式设定及eprom读写

    matlab基于RRT和人工势场法混合算法的路径规划.zip

    matlab基于RRT和人工势场法混合算法的路径规划.zip

    matlab基于matlab的两步定位软件定义接收机的开源GNSS直接位置估计插件模块.zip

    matlab基于matlab的两步定位软件定义接收机的开源GNSS直接位置估计插件模块.zip

    office 2016三和一精简版

    office 2016三和一精简版

    Scrapy-1.0.2-py2-none-any.whl

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    麦肯锡咨询顾问必备宝典-时间管理.ppt

    麦肯锡咨询顾问必备宝典-时间管理.ppt

    setuptools-0.6c10-py2.4.egg

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    麦肯锡顾问的黄金思考方法.pptx

    麦肯锡顾问的黄金思考方法.pptx

    91fdd461elb59a4ce8dfcfc46bc283a7.msi

    91fdd461elb59a4ce8dfcfc46bc283a7.msi

    ansys maxwell

    ansys maxwell

    5-5.py

    5-5

    xx广告促销计划流程实施手册.ppt

    xx广告促销计划流程实施手册.ppt

    仿小米商城微信小程序源码+项目说明.zip

    仿小米商城微信小程序源码+项目说明.zip

    pytest-4.6.0.tar.gz

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    Scrapy-2.10.1.tar.gz

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    麦肯锡xx客户满意服务.ppt

    麦肯锡xx客户满意服务.ppt

    网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面.zip

    网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面.zip

    基于python+Scrapy的农业数据爬虫设计与实现

    【作品名称】:基于python+Scrapy的农业数据爬虫设计与实现 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 基于Scrapy的农业数据爬虫设计与实现 . ├── Crops # web服务 │ ├── app.py │ ├── static # 静态文件 │ │ ├── css │ │ └── js │ └── templates # 静态页面 │ ├── corn.html │ ├── corns.html │ ├── index.html │ ├── porcor.html │ ├── pork.html │ └── porks.html ├── README.md └── spider # 爬虫及数据处理 ├── integration # 数据汇总 │ └── corn.py └── tutorial # 爬虫 ├── scrap

Global site tag (gtag.js) - Google Analytics