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(); } }
相关推荐
本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...
【Spring AOP的静态代理和动态代理】 在软件开发中,代理模式是一种常见的设计模式,它允许我们在不修改原有对象的基础上,对对象的行为进行增强。代理模式的核心思想是通过代理对象来控制对原始对象(也称为委托...
总的来说,JDK动态代理是Spring AOP实现的基础,它允许我们在运行时动态创建代理对象,实现对方法调用的拦截和增强。Spring AOP则在此基础上提供了更高级的抽象,让我们可以方便地定义和管理切面,从而实现更灵活的...
本篇文章将探讨如何通过JDK动态代理实现Spring AOP的基础知识。 首先,我们要理解什么是JDK动态代理。在Java中,动态代理机制允许我们在运行时创建一个实现了特定接口的新类。这个新类的实例可以代理目标对象,执行...
在Java开发领域,Spring框架是应用最广泛的轻量级框架之一,它提供了众多功能,包括依赖注入、面向切面编程(AOP)等。本文将详细介绍在使用Spring AOP时所需的两个关键jar包:aopalliance-1.0.jar和aspectjweaver-...
总结,这个"SpringAOP简单项目实现"涵盖了Spring AOP的基础知识,包括切面、通知、切入点的定义与配置,以及如何在实际项目中使用Maven进行构建和依赖管理。对于初学者来说,这是一个很好的实践案例,能够帮助他们...
Spring AOP(面向切面编程)是Spring框架的一个核心组件,它允许开发者在不改变原有代码的情况下,通过预编译和运行期动态代理技术,向程序中动态地添加额外的功能。本教程主要介绍AOP的基本概念,使用代理模式实现...
Spring AOP的基础是动态代理,它可以创建目标对象的代理对象来实现切面功能。有两种代理方式:JDK动态代理和CGLIB代理。JDK动态代理适用于接口实现类,它通过反射机制在运行时生成实现了目标接口的代理类;而CGLIB...
描述中的“额外jar包”可能指的是如AspectJ的库,AspectJ是一个强大的静态和动态AOP框架,可以与Spring AOP集成。AspectJ的编译器(aspectjrt.jar和aspectjweaver.jar)用于在编译时或运行时织入切面,而...
在Spring AOP中,有两种代理方式:静态代理和动态代理。 1.1. 静态代理 在静态代理中,我们创建一个代理类,该代理类实现了与目标对象相同的接口,并在代理类的方法中添加额外的逻辑,如记录日志。这种方式的缺点...
Spring AOP的实现原理主要包括静态AOP和动态AOP。Spring采用动态AOP,其技术基础是代理模式,可以使用JDK动态代理或CGLIB实现。 - **JDK动态代理**:适用于被代理对象实现接口的情况。通过实现InvocationHandler...
在Java世界中,Spring框架以其强大的功能和灵活性深受开发者喜爱,尤其在面向切面编程(AOP)方面,Spring提供了非常全面的支持。...同时,了解这些基础组件的工作原理,将有助于你更好地理解和优化Spring AOP的应用。
**一、Spring AOP基础** Spring AOP是Spring框架的一部分,它提供了一种在运行时动态地将行为加入到对象中的方法。AOP的核心概念包括切面(Aspect)、连接点(Join Point)、通知(Advice)、切入点(Pointcut)和...
在Spring AOP中,有两种主要的代理方式:静态代理和动态代理。 静态代理是通过创建目标对象的代理类来实现的。在示例中,`HelloSpeaker`是原始业务对象,实现了`IHello`接口。为了添加记录日志的功能,我们创建了一...
**动态代理**是AOP的基础,Spring支持两种动态代理方式:JDK动态代理和CGLIB代理。JDK动态代理适用于目标对象实现了接口的情况,它通过反射机制创建代理对象;而CGLIB则是在目标对象没有接口的情况下,通过继承生成...
代理模式分为静态代理和动态代理两种。静态代理是在编译时期就确定了代理对象和真实对象的关系,通常需要手动创建代理类并实现与真实对象相同的接口。例如在上面的例子中,`HelloLoggerProxy`就是`HelloImpl`的一个...
代理模式可以进一步细分为静态代理和动态代理。 - **静态代理**:在程序编译时就已经确定代理类的具体实现方式。这意味着每次需要代理不同的操作时,都需要修改代理类的代码,这违反了软件工程中的开闭原则。 - **...
Spring AOP基础** - **切面(Aspect)**: 切面是关注点的模块化,例如事务管理、日志记录等。在Spring AOP中,切面可以通过编写`@Aspect`注解的类来定义。 - **通知(Advice)**: 通知是在特定连接点(Join Point)...
本示例代码实现了Spring AOP的基础概念,并以静态代理和动态代理两种方式来展示其工作原理。 首先,我们要理解什么是代理设计模式。代理模式提供了一个接口,使得客户端可以通过这个接口与目标对象进行交互,而代理...
代理模式分为静态代理和动态代理两种主要形式。 **静态代理**是程序员手动创建代理类,这个代理类与真实被代理的对象(目标对象)实现相同的接口。代理类在调用目标对象方法时,可以加入额外的操作,如日志记录、...