`
zhuhui_zj
  • 浏览: 36637 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring aop分析(二)

 
阅读更多

三、计算拦截器链

    调用链图:


    JdkDynamicAopProxy实现了InvocationHandler接口,当其创建的JDK Proxy上的某一个方法被调用时,将会被JdkDynamicAopProxy类中的invoke(..)方法拦截:

final class JdkDynamicAopProxy implements AopProxy, InvocationHandler, Serializable {

	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		...

		try {
			...
			target = targetSource.getTarget();
			if (target != null) {
				targetClass = target.getClass();
			}

			// 计算拦截器链
			List chain = this.advised.advisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice(
					this.advised, proxy, method, targetClass);

			if (chain.isEmpty()) {
				// 拦截器链为空,直接调用目标对象上的方法
				retVal = AopUtils.invokeJoinpointUsingReflection(target, method, args);
			}
			else {
				// 调用方法
				invocation = new ReflectiveMethodInvocation(
						proxy, target, method, args, targetClass, chain);
				retVal = invocation.proceed();
			}

			...
			return retVal;
		}
		finally {
			...
		}
	}

  ...
}

    AdvisedSupport中AdvisorChainFactory的默认实现是HashMapCachingAdvisorChainFactory,它能将某一方法上的拦截器链进行缓存。

public final class HashMapCachingAdvisorChainFactory implements AdvisorChainFactory {

	public List getInterceptorsAndDynamicInterceptionAdvice(
			Advised config, Object proxy, Method method, Class targetClass) {
               private final Map methodCache = CollectionFactory.createIdentityMapIfPossible(32);

		List cached = (List) this.methodCache.get(method);
		if (cached == null) {
			// recalculate
			cached = AdvisorChainFactoryUtils.calculateInterceptorsAndDynamicInterceptionAdvice(
					config, proxy, method, targetClass);
			this.methodCache.put(method, cached);
		}
		return cached;
	}

  ...
}

    工具类AdvisorChainFactoryUtils提供了计算拦截器的方法:

public abstract class AdvisorChainFactoryUtils {

	public static List calculateInterceptorsAndDynamicInterceptionAdvice(
			Advised config, Object proxy, Method method, Class targetClass) {

		List interceptorList = new ArrayList(config.getAdvisors().length);
		...
		AdvisorAdapterRegistry registry = GlobalAdvisorAdapterRegistry.getInstance();
		for (int i = 0; i < config.getAdvisors().length; i++) { //遍历每一个Advisor
			Advisor advisor = config.getAdvisors()[i];
			if (advisor instanceof PointcutAdvisor) {
				// add it conditionally
				PointcutAdvisor pointcutAdvisor = (PointcutAdvisor) advisor;
                               // 计算该Advisor是否适合该class
				if (pointcutAdvisor.getPointcut().getClassFilter().matches(targetClass)) {
                                       // 将advisor持有的before、after、throws等advice转化为统一
                                       // 的MethodInterceptor
      					Interceptor[] interceptors = registry.getInterceptors(advisor);
					MethodMatcher mm = pointcutAdvisor.getPointcut().getMethodMatcher();
                                       // 计算该Advisor是否适合该method
					if (methodMatches(mm,method, targetClass,hasIntroductions)) {
						if (mm.isRuntime()) {
							... //动态interceptor
						}
						else {
                                                       // 将该Advisor加入method的interceptor列表
							interceptorList.addAll(Arrays.asList(interceptors));
						}
					}
				}
			}
			else if (advisor instanceof IntroductionAdvisor) {
				...
			}
		}
		return interceptorList;
	}

  ...
}
  • 大小: 20.2 KB
分享到:
评论

相关推荐

    AOP流程源码分析-SpringAOP中定义的类图

    AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析...

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

    Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...

    五、Spring源码分析——Spring Aop

    《Spring AOP 源码分析》 在深入探讨Spring AOP之前,我们先要理解AOP(面向切面编程)的基本概念。AOP是一种编程范式,它将关注点分离,使得我们可以将横切关注点(如日志、事务管理、安全检查等)与业务逻辑解耦...

    Spring AOP实现机制

    **Spring AOP 实现机制详解** Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的...

    Spring AOP框架实现的结构分析

    在本文中,我们将从实现的角度来认识 SpringAOP 框架,从外部接口、内部实现、组成部分、执行过程四个方面来介绍 Spring AOP 框架的结构分析。 最后,本文的目标是从实现的角度来认识 SpringAOP 框架,观察的角度是...

    spring aop 学习笔记

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和抽象化的方法来处理系统中的交叉关注点,如日志、事务管理、安全性等。本学习笔记将深入探讨Spring AOP的核心概念、工作原理以及实际...

    spring-aop-jar

    在IT领域,Spring框架是一个广泛使用的Java应用框架,它提供了许多功能,包括依赖注入、面向切面编程(AOP)等。"spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨...

    Spring AOP简单demo

    **Spring AOP 简介** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要模块,它扩展了传统的面向对象编程,允许开发者定义“横切关注点”(cross-cutting concerns),如日志、事务...

    spring AOP的运用

    在本文中,我们将深入探讨Spring AOP的运用,并结合源码分析其工作原理。 首先,了解AOP的基本概念: 1. 切面(Aspect):切面是关注点的模块化,这些关注点通常是跨越多个对象的横切关注点,例如事务管理、日志...

    springAOP核心组件分析.pdf

    Spring AOP(面向切面编程)是Spring框架的一个重要组成部分,它允许开发者将横切关注点与业务逻辑分离,实现业务逻辑的模块化。AOP核心组件包括几个关键概念,如切面(Aspect)、通知(Advice)、连接点(Joinpoint...

    spring aop 经典例子(原创)

    Spring AOP,全称Aspect-Oriented Programming,是Spring框架中的一个重要组成部分,它引入了面向切面编程的概念,使得开发者可以将关注点分离,更好地实现业务逻辑与系统服务的解耦。在这个经典例子中,我们将深入...

    Spring aop 性能监控器

    本篇文章将深入探讨如何使用Spring AOP实现性能监控器,并通过源码分析来理解其工作原理。 首先,我们要了解AOP的核心概念——切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入...

    JavaEE Spring AOP使用

    通过分析这个测试案例,你可以了解如何在实际项目中实现AOP。例如,它可能包含了一个带有切面逻辑的切面类,使用了`@Before`注解的方法会在目标方法执行前运行,而使用`@After`注解的方法则会在目标方法执行后运行。...

    Spring Aop使用实例

    **Spring AOP 使用实例** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它提供了一种在不修改原有代码的情况下,通过代理方式添加额外功能的技术。这种技术使得我们...

    spring aop 附带测试实例

    在提供的压缩包文件"springAOP"中,可能包含了以下内容: - **切面类(Aspect Class)**:包含切点和通知的Java类,可能使用了`@Aspect`注解。 - **目标类(Target Class)**:被AOP代理的对象,通常包含业务逻辑。...

    Spring AOP需要jar包.rar

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。在Java应用中,AOP通过代理模式实现,使得我们可以将横切关注...

    Spring AOP实现 项目源码 Myeclipse 直接导入可用

    **二、Myeclipse 中使用 Spring AOP** Myeclipse 是一款集成开发环境,支持Spring框架的开发。在Myeclipse中配置Spring AOP项目,你需要: 1. 创建Spring工程,导入所需的Spring库。 2. 配置Spring的XML配置文件,...

    spring源码--AOP流程--笔记.docx

    Spring AOP 源码分析笔记 Spring AOP(Aspect-Oriented Programming)是一种编程范式,它允许开发者 modularize cross-cutting concerns,即将横切关注点模块化。AOP 使得开发者可以将一些公共的功能模块化,以便在...

    spring aop实例

    **二、Spring AOP配置** 在Spring中配置AOP,主要有两种方式:基于XML和基于注解。这里我们主要介绍基于注解的方式,因为它是现代Spring应用的首选方法。 1. **启用AOP代理**:在Spring配置文件中,通过`&lt;aop:...

Global site tag (gtag.js) - Google Analytics