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

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  

相关推荐

    代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)与SpringAOP的3种配置方式案例工程代码

    本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...

    Spring AOP的静态代理和动态代理,转移到调用处理器一个集中的方法中处理.docx

    【Spring AOP的静态代理和动态代理】 在软件开发中,代理模式是一种常见的设计模式,它允许我们在不修改原有对象的基础上,对对象的行为进行增强。代理模式的核心思想是通过代理对象来控制对原始对象(也称为委托...

    JDK动态代理 spring aop 的原理

    总的来说,JDK动态代理是Spring AOP实现的基础,它允许我们在运行时动态创建代理对象,实现对方法调用的拦截和增强。Spring AOP则在此基础上提供了更高级的抽象,让我们可以方便地定义和管理切面,从而实现更灵活的...

    模拟spring aop【一】基于jdk动态代理实现的aop

    本篇文章将探讨如何通过JDK动态代理实现Spring AOP的基础知识。 首先,我们要理解什么是JDK动态代理。在Java中,动态代理机制允许我们在运行时创建一个实现了特定接口的新类。这个新类的实例可以代理目标对象,执行...

    Spring AOP需要的jar

    在Java开发领域,Spring框架是应用最广泛的轻量级框架之一,它提供了众多功能,包括依赖注入、面向切面编程(AOP)等。本文将详细介绍在使用Spring AOP时所需的两个关键jar包:aopalliance-1.0.jar和aspectjweaver-...

    SpringAOP简单项目实现

    总结,这个"SpringAOP简单项目实现"涵盖了Spring AOP的基础知识,包括切面、通知、切入点的定义与配置,以及如何在实际项目中使用Maven进行构建和依赖管理。对于初学者来说,这是一个很好的实践案例,能够帮助他们...

    spring AOP 基础

    Spring AOP(面向切面编程)是Spring框架的一个核心组件,它允许开发者在不改变原有代码的情况下,通过预编译和运行期动态代理技术,向程序中动态地添加额外的功能。本教程主要介绍AOP的基本概念,使用代理模式实现...

    Spring AOP面向切面三种实现

    Spring AOP的基础是动态代理,它可以创建目标对象的代理对象来实现切面功能。有两种代理方式:JDK动态代理和CGLIB代理。JDK动态代理适用于接口实现类,它通过反射机制在运行时生成实现了目标接口的代理类;而CGLIB...

    Spring3.0AOP所需jar包

    描述中的“额外jar包”可能指的是如AspectJ的库,AspectJ是一个强大的静态和动态AOP框架,可以与Spring AOP集成。AspectJ的编译器(aspectjrt.jar和aspectjweaver.jar)用于在编译时或运行时织入切面,而...

    Spring_AOP

    在Spring AOP中,有两种代理方式:静态代理和动态代理。 1.1. 静态代理 在静态代理中,我们创建一个代理类,该代理类实现了与目标对象相同的接口,并在代理类的方法中添加额外的逻辑,如记录日志。这种方式的缺点...

    Spring aop 深入剖析.docx

    Spring AOP的实现原理主要包括静态AOP和动态AOP。Spring采用动态AOP,其技术基础是代理模式,可以使用JDK动态代理或CGLIB实现。 - **JDK动态代理**:适用于被代理对象实现接口的情况。通过实现InvocationHandler...

    Spring使用AOP的三个jar包

    在Java世界中,Spring框架以其强大的功能和灵活性深受开发者喜爱,尤其在面向切面编程(AOP)方面,Spring提供了非常全面的支持。...同时,了解这些基础组件的工作原理,将有助于你更好地理解和优化Spring AOP的应用。

    SpringAOP+AspectJ

    **一、Spring AOP基础** Spring AOP是Spring框架的一部分,它提供了一种在运行时动态地将行为加入到对象中的方法。AOP的核心概念包括切面(Aspect)、连接点(Join Point)、通知(Advice)、切入点(Pointcut)和...

    Spring AOP课件

    在Spring AOP中,有两种主要的代理方式:静态代理和动态代理。 静态代理是通过创建目标对象的代理类来实现的。在示例中,`HelloSpeaker`是原始业务对象,实现了`IHello`接口。为了添加记录日志的功能,我们创建了一...

    Spring AOP源码深度解析:掌握Java高级编程核心技术

    **动态代理**是AOP的基础,Spring支持两种动态代理方式:JDK动态代理和CGLIB代理。JDK动态代理适用于目标对象实现了接口的情况,它通过反射机制创建代理对象;而CGLIB则是在目标对象没有接口的情况下,通过继承生成...

    SpringAOP入门

    代理模式分为静态代理和动态代理两种。静态代理是在编译时期就确定了代理对象和真实对象的关系,通常需要手动创建代理类并实现与真实对象相同的接口。例如在上面的例子中,`HelloLoggerProxy`就是`HelloImpl`的一个...

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    代理模式可以进一步细分为静态代理和动态代理。 - **静态代理**:在程序编译时就已经确定代理类的具体实现方式。这意味着每次需要代理不同的操作时,都需要修改代理类的代码,这违反了软件工程中的开闭原则。 - **...

    spring-nested-aop.zip_aop_spring aop

    Spring AOP基础** - **切面(Aspect)**: 切面是关注点的模块化,例如事务管理、日志记录等。在Spring AOP中,切面可以通过编写`@Aspect`注解的类来定义。 - **通知(Advice)**: 通知是在特定连接点(Join Point)...

    spring-aop-review-tcf.zip

    本示例代码实现了Spring AOP的基础概念,并以静态代理和动态代理两种方式来展示其工作原理。 首先,我们要理解什么是代理设计模式。代理模式提供了一个接口,使得客户端可以通过这个接口与目标对象进行交互,而代理...

    静态代理动态代理测试,模拟jdk实现动态代理

    代理模式分为静态代理和动态代理两种主要形式。 **静态代理**是程序员手动创建代理类,这个代理类与真实被代理的对象(目标对象)实现相同的接口。代理类在调用目标对象方法时,可以加入额外的操作,如日志记录、...

Global site tag (gtag.js) - Google Analytics