`
跑龙套_az
  • 浏览: 7816 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring AOP与动态代理

阅读更多

       

        刚接触动态代理模式的时候,感觉着东西确实有意思,但仔细想想貌似平常很少情况下会被使用。后来知道了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(动态代理)

    在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    Spring AOP支持不同的代理策略,包括JDK动态代理和CGLIB代理。如果被代理的类没有实现接口,Spring AOP会采用CGLIB来生成代理对象。CGLIB(Code Generation Library)是一个开源的代码生成库,它允许运行时在内存中...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...

    springAOP配置动态代理实现

    动态代理则是Spring AOP实现的核心技术之一,它允许我们在运行时创建具有额外行为的对象。下面将详细阐述Spring AOP的配置以及动态代理的实现。 一、Spring AOP基础知识 1. **什么是AOP**:AOP是一种编程范式,...

    springAop默认代理方式.zip

    Spring AOP会为每个目标对象创建一个子类,并覆盖其方法,添加AOP代理逻辑。 4. **代理模式的创建**:Spring AOP 使用`org.springframework.aop.framework.ProxyFactoryBean`或`@EnableAspectJAutoProxy`注解来配置...

    Java动态代理(Spring Aop原理)

    在Spring框架中,AOP(面向切面编程)就是基于Java动态代理来完成的,用于实现横切关注点,如日志、事务管理等。这篇博客的文章链接虽然没有给出具体内容,但我们可以根据Java动态代理和Spring AOP的基本概念来深入...

    JDK动态代理 spring aop 的原理

    5. AOP代理的使用:当通过Spring的依赖注入(DI)获取到一个对象时,实际上得到的是一个代理对象。通过这个代理对象调用方法,Spring会自动插入预先定义好的通知逻辑。 总的来说,JDK动态代理是Spring AOP实现的...

    Spring框架+SpringAOP动态代理

    ### Spring框架+SpringAOP动态代理 #### 一、Spring AOP 动态代理概述 在探讨Spring AOP(Aspect-Oriented Programming,面向切面编程)中的动态代理之前,我们首先简要回顾一下AOP的基本概念。面向切面编程是一种...

    spring aop jar 包

    `aop-jar`这个压缩包可能包含了Spring AOP的实现类、接口、以及其他相关的辅助类,例如动态代理类、切点匹配器等。在项目中,我们通常会将这个jar包引入到类路径下,以便使用Spring AOP的功能。 总的来说,Spring ...

    反射实现 AOP 动态代理模式(Spring AOP 的实现 原理) - Java 例子 -

    Spring框架是Java中实现AOP的一个流行工具,它通过动态代理机制实现了这一功能。本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切...

    Spring-AOP-JDK动态代理

    本篇将详细讲解Spring中的AOP实现,特别是JDK动态代理的应用。 首先,我们要了解什么是AOP(Aspect Oriented Programming,面向切面编程)。AOP是一种编程范式,旨在解决应用程序中分散的、横切关注点的问题,如...

    代理模式与动态代理--Spring AOP原理.doc

    代理模式与动态代理--Spring AOP原理.doc

    Spring AOP 16道面试题及答案.docx

    Spring AOP代理是框架为实现切面功能创建的对象,它在运行时实现切面协议。Spring提供了两种代理方式:JDK动态代理和CGLIB代理。JDK代理适用于那些实现了接口的类,而CGLIB代理则适用于没有实现接口的类。 引介...

    简单spring aop 例子

    1. **代理**:Spring AOP支持两种类型的代理:JDK动态代理和CGLIB代理。JDK代理用于实现了接口的类,而CGLIB代理则用于没有接口或不希望使用接口的类。代理对象在调用目标方法时会执行切面逻辑。 2. **织入**:织入...

    SpringAOP之探秘(动态代理、责任链模式、注解使用)

    本篇文章将深入探讨Spring AOP中的动态代理、责任链模式以及注解的使用。 首先,动态代理是实现AOP的关键技术之一。在Java中,有两种主要的动态代理实现方式:JDK动态代理和CGLIB。JDK动态代理基于接口,当目标类...

    通过动态代理模拟Spring AOP

    本篇文章将详细探讨如何通过Java的动态代理机制来模拟Spring AOP的核心概念。 首先,让我们了解什么是动态代理。在Java中,动态代理主要由`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口...

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

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

    Spring AOP完整例子

    在测试方法中,可以注入需要的bean,然后调用方法来触发AOP代理。这样,通知将在适当的时候被调用,我们可以验证其预期行为。 为了更深入地理解这些概念,你可以查看压缩包中的具体代码,例如,`ExampleAspect`类...

    Spring AOP实现机制

    Spring AOP主要通过两种方式实现:JDK动态代理和CGLIB代理。 - **JDK动态代理**: - 当目标对象实现了至少一个接口时,Spring会使用JDK的java.lang.reflect.Proxy类创建一个代理对象。 - 代理对象在调用实际方法...

Global site tag (gtag.js) - Google Analytics