一、简介
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图:
相关推荐
AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析...
Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...
《Spring AOP 源码分析》 在深入探讨Spring AOP之前,我们先要理解AOP(面向切面编程)的基本概念。AOP是一种编程范式,它将关注点分离,使得我们可以将横切关注点(如日志、事务管理、安全检查等)与业务逻辑解耦...
Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的可复用性和可维护性。 ### 1. ...
在本文中,我们将从实现的角度来认识 SpringAOP 框架,从外部接口、内部实现、组成部分、执行过程四个方面来介绍 Spring AOP 框架的结构分析。 最后,本文的目标是从实现的角度来认识 SpringAOP 框架,观察的角度是...
在IT领域,Spring框架是一个广泛使用的Java应用框架,它提供了许多功能,包括依赖注入、面向切面编程(AOP)等。"spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要模块,它扩展了传统的面向对象编程,允许开发者定义“横切关注点”(cross-cutting concerns),如日志、事务管理、性能监控等。...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和抽象化的方法来处理系统中的交叉关注点,如日志、事务管理、安全性等。本学习笔记将深入探讨Spring AOP的核心概念、工作原理以及实际...
Spring AOP(面向切面编程)是Spring框架的一个重要组成部分,它允许开发者将横切关注点与业务逻辑分离,实现业务逻辑的模块化。AOP核心组件包括几个关键概念,如切面(Aspect)、通知(Advice)、连接点(Joinpoint...
在本文中,我们将深入探讨Spring AOP的运用,并结合源码分析其工作原理。 首先,了解AOP的基本概念: 1. 切面(Aspect):切面是关注点的模块化,这些关注点通常是跨越多个对象的横切关注点,例如事务管理、日志...
Spring AOP,全称Aspect-Oriented Programming,是Spring框架中的一个重要组成部分,它引入了面向切面编程的概念,使得开发者可以将关注点分离,更好地实现业务逻辑与系统服务的解耦。在这个经典例子中,我们将深入...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它提供了一种在不修改原有代码的情况下,通过代理方式添加额外功能的技术。这种技术使得我们可以实现如日志记录、事务...
在Spring AOP中,切面可以由一个或多个通知(advice)组成。 2. **通知(Advice)**:通知是在特定连接点上执行的代码,例如方法调用前后。Spring支持五种类型的通知:前置通知(Before)、后置通知(After)、返回...
在IT行业中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们在不修改代码的情况下,对应用程序的特定部分进行拦截和增强。这在性能监控、日志记录、事务管理等方面尤为有用。本篇文章将深入探讨如何使用...
在提供的压缩包文件"springAOP"中,可能包含了以下内容: - **切面类(Aspect Class)**:包含切点和通知的Java类,可能使用了`@Aspect`注解。 - **目标类(Target Class)**:被AOP代理的对象,通常包含业务逻辑。...
Spring AOP 源码分析笔记 Spring AOP(Aspect-Oriented Programming)是一种编程范式,它允许开发者 modularize cross-cutting concerns,即将横切关注点模块化。AOP 使得开发者可以将一些公共的功能模块化,以便在...
其中,AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它允许开发者将关注点从核心业务逻辑中分离出来,如日志记录、事务管理等,这些被称为“切面”的功能可以被模块化并独立处理。...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。在Java应用中,AOP通过代理模式实现,使得我们可以将横切关注...