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

spring aop分析(一)

 
阅读更多

一、简介

    Spring Aop模块采用了代理(Proxy)机制来实现AOP功能,在运行过程中aop框架大致可以分成三个阶段:创建代理、计算拦截器链、处理调用。

    在“创建代理”阶段,Spring AOP可以根据目标类的实现或设置采用JDK自动代理或CGLIB来创建目标对象的代理;对于静态的Pointcut,框架在目标方法第一次调用时将计算应用于该方法之上的“拦截器链”;在方法调用时,框架将依次调用拦截器并最终执行方法的调用。

二、创建代理

    ProxyFactoryBean是Spring AOP内置的工厂类,它能配置为spring容器中的bean,并为目标类创建代理:

public class ProxyFactoryBean extends AdvisedSupport
    implements ... {

	public Object getObject() throws BeansException {
		// 初始化advisor列表
		initializeAdvisorChain();
		
		if (isSingleton()) { // 单件代理
			return getSingletonInstance();
		}
		else {
			...
			return newPrototypeInstance();
		}
	}

  ...
}

    在initializeAdvisorChain()方法中,Spring AOP将初始化ProxyFactoryBean配置中的Advisor:

public class ProxyFactoryBean extends AdvisedSupport
    implements ... {

	private synchronized void initializeAdvisorChain() throws ... {
		...
               // interceptorNames是ProxyFactoryBean在配置时设定的拦截器列表
		if (!ObjectUtils.isEmpty(this.interceptorNames)) {
			...

			for (int i = 0; i < this.interceptorNames.length; i++) {
				String name = this.interceptorNames[i];
	
				if (name.endsWith(GLOBAL_SUFFIX)) {
					...
				} else {	
					Object advice = null;
                                       // 若代理和拦截器都是单件
					if (this.singleton || this.beanFactory.isSingleton(this.interceptorNames[i])) {
						// 从Spring Ioc容器中寻找
						advice = this.beanFactory.getBean(this.interceptorNames[i]);
					}
					else { // 处理prototype的情形
						...
					}
                                       // 将advice加入拦截器列表
					addAdvisorOnChainCreation(advice, this.interceptorNames[i]);
				}
			}
		}

		this.advisorChainInitialized = true;
	}

  ...
}

    拦截器链初始化完成之后将创建代理:

public class ProxyFactoryBean extends AdvisedSupport
    implements ... {

	private synchronized Object getSingletonInstance() {
		if (this.singletonInstance == null) {
			this.targetSource = freshTargetSource();
			if (...) { //自动探测目标对象实现的接口
				// Rely on AOP infrastructure to tell us what interfaces to proxy.
				setInterfaces(ClassUtils.getAllInterfacesForClass(this.targetSource.getTargetClass()));
			}
		        ...
			this.singletonInstance = getProxy(createAopProxy());
			...
		}
		return this.singletonInstance;
	}

	protected Object getProxy(AopProxy aopProxy) {
		return aopProxy.getProxy(this.beanClassLoader);
	}

  ...
}

    createAopProxy()方法来自ProxyFactoryBean的父类AdvisedSupport, 该方法将根据环境创建一个JDK或CGLIB代理

public class AdvisedSupport extends ProxyConfig implements Advised {

	protected synchronized AopProxy createAopProxy() {
		if (!this.isActive) {
			activate();
		}
		// 使用AopProxyFactory来创建AopProxy
                // 默认的factory是DefaultAopProxyFactory
                return getAopProxyFactory().createAopProxy(this);
	}

  ...
}

public class DefaultAopProxyFactory implements AopProxyFactory {

	public AopProxy createAopProxy(AdvisedSupport advisedSupport) throws AopConfigException {
		if (advisedSupport.isOptimize() || advisedSupport.isProxyTargetClass() ||
		    advisedSupport.getProxiedInterfaces().length == 0) { // 使用CGLIB创建proxy
			...
			return CglibProxyFactory.createCglibProxy(advisedSupport);
		}
		else {
			return new JdkDynamicAopProxy(advisedSupport);
		}
	}

  ...
}

    其中JdkDynamicAopProxy类使用JDK动态代理来创建AOP功能:

final class JdkDynamicAopProxy implements AopProxy, InvocationHandler, Serializable {

	public Object getProxy(ClassLoader classLoader) {
		...
               // 得到要代理的接口,系统自动追加Advised接口
		Class[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised);
               // 检查equals()和hashCode()方法
		findDefinedEqualsAndHashCodeMethods(proxiedInterfaces);
               // 使用java.lang.reflect.Proxy来创建JDK代理
		return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);
	}

  ...
}

   调用的UML图:

 

 

  • 大小: 16.8 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的引入极大地提高了代码的可复用性和可维护性。 ### 1. ...

    Spring AOP框架实现的结构分析

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

    spring-aop-jar

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

    Spring AOP简单demo

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

    spring aop 学习笔记

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

    springAOP核心组件分析.pdf

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

    spring AOP的运用

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

    spring aop 经典例子(原创)

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

    Spring Aop使用实例

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

    JavaEE Spring AOP使用

    在Spring AOP中,切面可以由一个或多个通知(advice)组成。 2. **通知(Advice)**:通知是在特定连接点上执行的代码,例如方法调用前后。Spring支持五种类型的通知:前置通知(Before)、后置通知(After)、返回...

    Spring aop 性能监控器

    在IT行业中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们在不修改代码的情况下,对应用程序的特定部分进行拦截和增强。这在性能监控、日志记录、事务管理等方面尤为有用。本篇文章将深入探讨如何使用...

    spring aop 附带测试实例

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

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

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

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

    其中,AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它允许开发者将关注点从核心业务逻辑中分离出来,如日志记录、事务管理等,这些被称为“切面”的功能可以被模块化并独立处理。...

    Spring AOP的底层实现技术

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点...

    Spring AOP需要jar包.rar

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

Global site tag (gtag.js) - Google Analytics