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

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  

相关推荐

    Java 基础核心总结 +经典算法大全.rar

    静态代理与动态代理常见的动态代理实现JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比动态代理的实际应用 Spring AOP 变量 变量汇总实例变量 实例变量的特点全局变量 静态变量 静态变量的特点类变量 局部变量

    JAVA高并发高性能高可用高扩展架构视频教程

    Java-Base64算法_创新_防止表单重复提交 JAVA企业级基础课题(HashMap那些事) 企业架构师必备技能(JAVA核心技术反射) JavaWeb之基础(手写实现Tomcat服务器)...揭开springAOP神秘面纱之动态代理 网络爬虫之JAVA正则表达式

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点(pointcut) 6.2.3.1. 切入点指定者的支持 6.2.3.2. 合并切入点...

    java 自整理的基础面试知识

    基础、数据结构和算法、基本数据类型、集合框架、算法、并发包源码、jdk中的设计模式、排序 以及复杂度、Spring、SpringAPI、Spring2依赖注入、Spring注解、Spring数据访问、Spring 的MVC、Spring拦截器 过滤器、...

    spring:Spring框架

    静态代理:由程序员创建或工具生成代理类的源码,再编译代理类,在程序运行前就产生了代理类的字节码文件,代理对象和目标对象的关系在程序运行前就决定了。 动态代理:在程序运行期间由JVM根据反射机制动态生成的,...

    spring.net中文手册在线版

    12.1.3.Spring.NET的AOP代理 12.2.Spring.NET中的切入点 12.2.1.概念 12.2.2.切入点的操作 12.2.3.Spring.NET提供的切入点实现类 12.2.3.1.静态切入点 12.2.3.2.动态切入点 12.2.4.自定义切入点 12.3.Spring.NET的...

    Spring.3.x企业应用开发实战(完整版).part2

    第6章 Spring AOP基础 6.1 AOP概述 6.1.1 AOP到底是什么 6.1.2 AOP术语 6.1.3 AOP的实现者 6.2 基础知识 6.2.1 带有横切逻辑的实例 6.2.2 JDK动态代理 6.2.3 CGLib动态代理 6.2.4 AOP联盟 6.2.5 代理知识小结 6.3 ...

    spring in action英文版

    第一部分 Spring基础  第1章 开始Spring之旅  1.1 为什么使用Spring  1.1.1 J2EE开发者的一天  1.1.2 Spring的承诺  1.2 Spring是什么  1.3 开始Spring之旅  1.4 理解反向控制  1.4.1 依赖...

    Spring3.x企业应用开发实战(完整版) part1

    第6章 Spring AOP基础 6.1 AOP概述 6.1.1 AOP到底是什么 6.1.2 AOP术语 6.1.3 AOP的实现者 6.2 基础知识 6.2.1 带有横切逻辑的实例 6.2.2 JDK动态代理 6.2.3 CGLib动态代理 6.2.4 AOP联盟 6.2.5 代理知识小结 6.3 ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而无难度地引入Spring Boot 的学习。涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而无难度地引入Spring Boot 的学习。涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制...

    java面试题

    答:控制反转和依赖注入是spring的两大基础作用。主要是将所有组件在spring提供的外部容器中加载。提高安全性,减低耦合性,使各个框架或者类之间的依赖性降低。 什么是声明式的事务管理?为什么要用?spring如何实现...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而无难度地引入Spring Boot 的学习。涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制...

    Java Web程序设计教程

    12.4springaop的代理工厂 253 12.4.1选择合适的代理 253 12.4.2proxyfactory 254 12.4.3proxyfactorybean 254 12.5项目实战——输出日志 256 本章小结 258 课后练习 259 第13章 spring与javaee持久化数据...

    asp.net知识库

    动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    动态规划 数据挖掘算法 KMP算法 GZZ算法 HASH分桶 关联规则算法 APRORIVE算法 分布式 负载均衡 水平伸缩 集群 分片 Key-hash 异步 一致性hash 消峰 分库分表 锁 悲观锁 乐观锁 行级锁 分布式...

    Java学习笔记-个人整理的

    {2.10.3}静态代码块}{62}{subsection.2.10.3} {2.11}\ttfamily final}{63}{section.2.11} {2.12}\ttfamily abstract}{63}{section.2.12} {2.13}\ttfamily interface}{64}{section.2.13} {2.14}JavaBean规范}{66...

    JAVA核心知识点整理(有效)

    25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................

Global site tag (gtag.js) - Google Analytics