一、简介
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流程源码分析...
springAOP核心源码流程分析,请基于5.0.6版本进行代码跟进。
spring aop框架源码级分析 结构图
有关于Spring,我们最常用的两个功能就是IOC和AOP,前几篇文章从源码级别介绍了Spring容器如何为我们生成bean及bean之间的依赖关系 下面我们接着来看AOP的源码实现。 有关于AOP,我们在面试中也被无数次问到...
springAOP核心源码流程分析,请基于5.0.6版本进行代码跟进。
NULL 博文链接:https://ylxy3058.iteye.com/blog/2224244
Spring AOP(面向切面编程)作为Spring框架的一个重要部分,为Java开发者提供了一个...通过对Spring AOP源码的深入分析,我们可以更好地理解其内部工作原理,从而在实际开发中更加灵活和高效地使用这一强大的编程范式。
Spring源代码解析(一):Spring中的事务处理 Spring源代码解析(二):ioc容器在Web容器中的启动 Spring源代码分析(三):Spring JDBC Spring源代码解析(四):Spring MVC Spring源代码解析(五):Spring AOP获取Proxy ...
本文深入分析了Spring AOP的实现机制,让读者能够更好地理解和应用这一强大的编程范式。 Spring AOP是基于代理模式实现的,主要包括动态代理、通知(Advice)、切点(Pointcut)、切面(Aspect)和连接点(Join ...
元注解方式结合AOP,灵活记录操作日志 能够记录详细错误日志为运维提供支持 日志记录尽可能减少性能影响
面试必考之HashMap源码分析与实现 探索JVM底层奥秘ClassLoader源码分析与案例讲解 面试必备技能之Dubbo企业实战 ...互联网系统垂直架构之Session解决方案 分库分表之后分布式下如何...无处不在的Spring AOP事务及踩过的坑
SpringAOP入门和原理分析,动态代理
aop分析笔记 个人总结所得 org.springframework.aop.framework.autoproxy
Java流行框架源码分析:Spring源码、SpringBoot源码、SpringAOP源码、SpringSecurity源码、SpringSecurity OAuth2源码、JDK源码、Netty源码
spring version: 5.0.0; jdk: 1.8 IOC大致调用顺序(IOC调用的AOP标签解析)
老王读 Spring AOP 系列文章的源码分析&测试代码 帮助大家学习 Spring 源码,更加了解 Spring 的底层 博客专栏地址:https://blog.csdn.net/wang489687009/category_11269905.html
主要介绍了Spring AOP中使用args表达式的方法,结合实例形式分析了spring面向切面AOP中使用args表达式具体步骤、相关实现技巧与操作注意事项,需要的朋友可以参考下
Spring_AOP入门与分析,深入分析技术精髓。
主要介绍了spring AOP定义AfterThrowing增加处理,结合实例形式分析了spring面向切面AOP定义AfterThrowing相关实现步骤与操作技巧,需要的朋友可以参考下
那么面向切面编程AOP(Aspect-OrientedProgramming)则可以对系统需求进行很好的模软件开发经历了从汇编语言到高级语言和从过程化编程到面向对象编程;前者是为了提高开发效率,而后者则使用了归纳法,把具有共性的...