刚接触动态代理模式的时候,感觉着东西确实有意思,但仔细想想貌似平常很少情况下会被使用。后来知道了Spring AOP的底层是采用动态代理实现的。
项目中采用spring声明式的事务控制、确实能够感受到AOP的存在,也能隐约明白AOP的底层实现和动态代码有莫大的关系。JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。
横切逻辑平时项目中出现的确实不多,但是某些场景下还是存在的。最典型的的例子便是事务控制,还有比如某些方法需要进行性能监控、某些方法需要进行用户合法性的验证、某些方法需要进行日志记录等。
下面通过方法的性能监控横切逻辑作为例子,了解下动态代理的一些知识。
package proxy.train; public class PerformanceMonitor { private static ThreadLocal<MethodPerformance> performanceRecord = new ThreadLocal<MethodPerformance>(); private long begin; private long end; private String serviceMethod; public void begin(String method) { System.out.println("begin monitor..."); begin = System.currentTimeMillis(); this.serviceMethod = method; } public void end() { System.out.println("end monitor..."); end = System.currentTimeMillis(); long elapse = end -begin; System.out.println(serviceMethod + "花费" + elapse + "毫秒\n"); } }
这是一个简单的性能监控横切逻辑类,当业务方法被调用的时候、将先运行该监控类的begin方法,当业务方法运行结束后将执行监控类的end方法,已获得业务方法的执行时间。
package proxy.train; public class ServiceImpl implements Service{ public void removeTopic(int topicId) { System.out.println("模拟删除Topic记录: " + topicId); try { Thread.sleep(60); } catch (InterruptedException e) { e.printStackTrace(); } } public void removeForum(int forumId) { System.out.println("模拟删除Forum记录: " + forumId); try { Thread.sleep(80); } catch (InterruptedException e) { e.printStackTrace(); } } }
上面是一个业务类,通过实现InvocationHandler接口的动态代理类、可以很好地将业务逻辑和横切逻辑组织在一起。
package proxy.train; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyInvocationHandler implements InvocationHandler { private Object target;//目标业务类 public void setTarget(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { PerformanceMonitor pm = new PerformanceMonitor(); pm.begin(method.getName()); Object result = method.invoke(target, args);//通过反射调用目标类的目标方法 pm.end(); return result; } }
package proxy.train; import java.lang.reflect.Proxy; public class MainTest { public static void main(String[] args) { ForumService fs = new ForumServiceImpl(); MyInvocationHandler handler = new MyInvocationHandler(); handler.setTarget(fs); ForumService fs1 = (ForumService) Proxy.newProxyInstance(fs.getClass().getClassLoader(), fs.getClass().getInterfaces(), handler); fs1.removeTopic(1024); fs1.removeForum(13); } }
上面的动态代理方法很好地将业务逻辑与横切逻辑编织在了一起。但是上面的实现方式也存在非常大的几个缺陷:
1、目标类的所有方法都被添加了横切逻辑,某些时候我们只想给部分特定的方法添加横切逻辑;
2、采用了硬编码的方式指定了植入逻辑的植入点,即在业务目标方法的开始和结束处植入横切逻辑;
3、我们手工编写代理实例的创建过程,为不同类创建代理时,需要分别编写相应的创建代码,无法通用。
这三个问题在AOP中占用重要的地位,Spring AOP的主要工作就是围绕以上三点展开的:Spring AOP通过Pointcut(切点)指定在哪些类的哪些方法上植入横切逻辑,通过Advice(增强)描述横切逻辑和方法的具体植入点(方法前、方法后、方法两端等)。Spring通过Advisor(切面)将Pointcut和Advice两者组装在一起。通过Advisor的信息,Spring就利用JDK动态代理技术采用统一的方式为目标Bean创建植入的代理对象。
相关推荐
在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...
Spring AOP支持不同的代理策略,包括JDK动态代理和CGLIB代理。如果被代理的类没有实现接口,Spring AOP会采用CGLIB来生成代理对象。CGLIB(Code Generation Library)是一个开源的代码生成库,它允许运行时在内存中...
在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...
动态代理则是Spring AOP实现的核心技术之一,它允许我们在运行时创建具有额外行为的对象。下面将详细阐述Spring AOP的配置以及动态代理的实现。 一、Spring AOP基础知识 1. **什么是AOP**:AOP是一种编程范式,...
Spring AOP会为每个目标对象创建一个子类,并覆盖其方法,添加AOP代理逻辑。 4. **代理模式的创建**:Spring AOP 使用`org.springframework.aop.framework.ProxyFactoryBean`或`@EnableAspectJAutoProxy`注解来配置...
在Spring框架中,AOP(面向切面编程)就是基于Java动态代理来完成的,用于实现横切关注点,如日志、事务管理等。这篇博客的文章链接虽然没有给出具体内容,但我们可以根据Java动态代理和Spring AOP的基本概念来深入...
5. AOP代理的使用:当通过Spring的依赖注入(DI)获取到一个对象时,实际上得到的是一个代理对象。通过这个代理对象调用方法,Spring会自动插入预先定义好的通知逻辑。 总的来说,JDK动态代理是Spring AOP实现的...
### Spring框架+SpringAOP动态代理 #### 一、Spring AOP 动态代理概述 在探讨Spring AOP(Aspect-Oriented Programming,面向切面编程)中的动态代理之前,我们首先简要回顾一下AOP的基本概念。面向切面编程是一种...
`aop-jar`这个压缩包可能包含了Spring AOP的实现类、接口、以及其他相关的辅助类,例如动态代理类、切点匹配器等。在项目中,我们通常会将这个jar包引入到类路径下,以便使用Spring AOP的功能。 总的来说,Spring ...
Spring框架是Java中实现AOP的一个流行工具,它通过动态代理机制实现了这一功能。本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切...
本篇将详细讲解Spring中的AOP实现,特别是JDK动态代理的应用。 首先,我们要了解什么是AOP(Aspect Oriented Programming,面向切面编程)。AOP是一种编程范式,旨在解决应用程序中分散的、横切关注点的问题,如...
代理模式与动态代理--Spring AOP原理.doc
Spring AOP代理是框架为实现切面功能创建的对象,它在运行时实现切面协议。Spring提供了两种代理方式:JDK动态代理和CGLIB代理。JDK代理适用于那些实现了接口的类,而CGLIB代理则适用于没有实现接口的类。 引介...
1. **代理**:Spring AOP支持两种类型的代理:JDK动态代理和CGLIB代理。JDK代理用于实现了接口的类,而CGLIB代理则用于没有接口或不希望使用接口的类。代理对象在调用目标方法时会执行切面逻辑。 2. **织入**:织入...
本篇文章将深入探讨Spring AOP中的动态代理、责任链模式以及注解的使用。 首先,动态代理是实现AOP的关键技术之一。在Java中,有两种主要的动态代理实现方式:JDK动态代理和CGLIB。JDK动态代理基于接口,当目标类...
本篇文章将详细探讨如何通过Java的动态代理机制来模拟Spring AOP的核心概念。 首先,让我们了解什么是动态代理。在Java中,动态代理主要由`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口...
本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...
在测试方法中,可以注入需要的bean,然后调用方法来触发AOP代理。这样,通知将在适当的时候被调用,我们可以验证其预期行为。 为了更深入地理解这些概念,你可以查看压缩包中的具体代码,例如,`ExampleAspect`类...
Spring AOP主要通过两种方式实现:JDK动态代理和CGLIB代理。 - **JDK动态代理**: - 当目标对象实现了至少一个接口时,Spring会使用JDK的java.lang.reflect.Proxy类创建一个代理对象。 - 代理对象在调用实际方法...