如果之前没有读过Spring源码,建议先看一下我之前写的一个实现AOP的小demo
在看SpingAOP源码之前先简单说一下SpingIOC的实现机制。SpingIOC的中最核心的接口是BeanFactory它更像是IOC容器的一个最基本的功能说明书,它有一个底层的实现类DefaultListableBeanFactory这个类基本上实现了BeanFactory体系中的所有重要功能,只有就是我们所熟悉的ApplicationContext。它是在BeanFactory的基础上做了扩展。继承了MessageSource, ApplicationEventPublisher, ResourcePatternResolver等接口以增强除BeanFactory基本功能之外的功能。ApplicationContext的子类基本上使用的就是DefaultListableBeanFactory。
IOC容器的初始化步骤:
1> 定位Resource资源
2> 创建DefaultListableBeanFactory
3> 创建处理资源的BeanDefinitionReader
4> 将Resource解析为Document
5> 将Document解析为Spring定义的内部数据结构BeanDefinition
6> 将BeanDefinition注册到Factory的CurrentHashMap中
7> 创建对象(BeanFactory,Constructor,CGLIB)
8> 解决依赖关系注入Property(期间会创建所有直接依赖或者间接依赖的类,直到这些类都创建并初始化完成之后,主类才会初始化完成)
9> 将Bean注册到DefaultSingletonBeanRegistry的ConcurrentHashMap中 SpingIOC是非常强大的强大的副作用就是代码不容易理解。所以说肯定是没有我之前写的那个AOP小Demo好理解了。首先来看AOP通知接口的体系结构。
SpingIOC是非常强大的强大的副作用就是代码不容易理解。所以说肯定是没有我之前写的那个AOP小Demo好理解了。首先来看AOP通知接口的体系结构。
之后是切入点:
还有一个Advisor(通知器),它用来将Advice和Pointcut组织在一起
想要调用代理方法,必须要先有代理对象,那么代理对象是在哪产生的?代理对象其实是在一个处理器AbstractAutoProxyCreator中产生的。用过Spring中处理器的人肯定知道实现BeanPostProcessor接口,然后覆盖postProcessBeforeInitialization,postProcessAfterInitialization两个方法就可以在bean执行init方法前后来处理逻辑了。其实现原理其实很简单,在初始化Bean时可以看到如下代码
分别是前置处理,init方法调用,后置处理。看一下生成代理对象类AbstractAutoProxyCreator的类签名
这样明白了,其实AbstractAutoProxyCreator类就是处理器。如果一个Bean需要创建代理对象的话,就会在这个Bean的init方法执行完之后调用后置处理器创建。创建完之后就会被放置到AbstractAutoProxyCreator类中的一个ConcurrentHashMap中
由于我的目标对象实现了接口所以使用的是JDK代理,否则的话会使用CGLIB代理。
这是最核心的类,所有被代理的方法都会调用它的invoke方法其中有一个字段
/** Config used to configure this proxy */ private final AdvisedSupport advised;
下面是它的截图
只要搞定它是怎么来的,就会知道通知,切入点,目标类是怎么产生的。
想向下追两个方法都很有用
在这里判断了是使用CGLIB创建代理还是JDK创建代理
可以看到之前那个万能的字段其实是ProxyCrentorSupport类的实例,还记得之前创建代理的AbstractAutoProxyCreator吗,它们有着共同的基类。ProxyConfig为它的子类提供了配置属性。
下面就要追一下这两个类之间是怎么建立关系的。上图调用createAopProxy(this)函数最开始的调用者是AbstractAutoProxyCreator也就是说这个this其实是ProxyFactory的实例
可以看到ProxyFactory又是ProxyCreatorSupport的子类。
那么proxyFactory又是怎么来的?
这样也就建立了ProxyCrentorSupport类与AbstractAutoProxyCreator的关系 。也就是说ProxyCrentorSupport在创建代理的工厂AbstractAutoProxyCreator与代理类之间建立了一个桥梁,真正有用的数据像通知,切入点,目标类等最初还是AbstractAutoProxyCreator提供的。ProxyCrentorSupport也起到屏蔽AbstractAutoProxyCreator中的一些敏感信息,防止被代理类获取到作用。ProxyCrentorSupport还是一个抽象工厂,是非常经典的抽象工厂模式的应用。
可以稍微追一下advisor是从哪来的
现在来看JdkDynamicAopProxy中invoke是怎么执行的。首先它会创建一个ReflectiveMethodInvocation实例,然后让这个实例来调用proceed方法。这个ReflectiveMethodInvocation就相当于之前小Demo的ApplicationFilterChain。其结构如下
其中每一个advice被调用时都会把自身实例传入其中,然后调完通知方法之后就会重新调用ReflectiveMethodInvocation实例的proceed方法。这样便形成了回调机制,也就实现了AOP的功能(跟我的小demo原理一样)。其他通知与前置通知类似,异常通知是直接让你执行一个try…catch块环绕的代码,这样报错之后就会被处理。至于最终通知是把proceed放在了一个try…finally中。
相关推荐
通过研究这个项目源码,你可以了解如何在实际开发中应用Spring AOP,以及如何在Myeclipse中进行配置和调试。 总之,Spring AOP通过将关注点分离,提高了代码的可维护性和复用性。结合Myeclipse的强大功能,开发者...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个...通过研究这些源码,你可以深入理解如何在实际项目中应用Spring AOP,实现模块化的关注点处理,并提高代码的可维护性和复用性。
深入研究Spring AOP的源码,可以帮助我们更好地理解其工作原理,例如,可以查看`org.springframework.aop.framework.ProxyFactoryBean`、`org.springframework.aop.aspectj.autoproxy.AspectJProxyFactoryBean`、`...
通过深入研究Spring AOP 2.0,我们可以更有效地组织代码,提高代码可读性和维护性,同时充分利用Spring框架提供的强大功能来解决实际问题。在实际项目中,合理运用AOP能够帮助我们构建更加优雅、可扩展的系统。
本压缩包中的"Spring-AOP"文件可能包含了示例代码和jar包,可以用来进一步研究和实践Spring AOP的使用。通过阅读源码,你可以深入理解Spring AOP的内部实现机制,这对于成为一位精通Spring框架的开发者至关重要。
在深入研究"SpringAop.zip"的内容之前,确保你已经安装了Spring框架和IntelliJ IDEA,并熟悉基本的Spring配置和编程。通过学习这个示例项目,你可以更直观地理解Spring AOP的工作原理及其在实际开发中的应用。
在本"Spring-AOP源码Demo"中,我们将深入探讨Spring AOP的工作原理以及如何通过源码学习其核心概念。 1. **AOP的基本概念** - **切面(Aspect)**:AOP的核心单元,它封装了横切关注点,包括通知(advice)、切入...
总结来说,"my-spring.rar-Spring-AOP源码Demo"提供了学习和研究Spring AOP的实例,涵盖了切面、通知、切入点等核心概念,通过分析源码,开发者能够深入理解Spring AOP的工作机制,并能将其应用于实际的项目开发中。
**Spring AOP 概述** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了在不...结合提供的`SpringAop`文件,你可以进一步研究和实践Spring AOP的具体实现和应用。
标签“源码”提示我们可以深入研究Spring AOP的源代码,了解其内部工作机制,这对于提升我们的编程技能和理解Spring框架的工作原理非常有帮助。而“工具”标签可能暗示我们可以利用IDE或其他辅助工具来更高效地开发...
至于源码分析,你可以查看Spring AOP的源代码,了解其内部如何匹配pointcut,如何执行advice,以及如何管理Advisor。通过阅读源码,可以加深对AOP原理的理解,帮助你在实际项目中更高效地应用。 在实际开发中,...
老王读 Spring AOP 系列文章的源码分析&测试代码 帮助大家学习 Spring 源码,更加了解 Spring 的底层 博客专栏地址:https://blog.csdn.net/wang489687009/category_11269905.html
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下对程序进行功能增强的机制。这个压缩包文件包含了关于Spring AOP的实践源码,通过分析这些源码,我们可以深入理解Spring...
Spring框架是Java开发中最常用的轻量级框架之一,它提供了依赖注入、面向切面编程(AOP)、数据访问、...通过深入研究源码、调试AOP示例,你可以更好地掌握Spring的核心特性和最佳实践,从而在实际项目中更加得心应手。
- 一个Spring配置文件,定义了bean、AOP切面、数据源和事务管理器。 - 使用了@Autowired注解自动装配Bean的Java类,展示了依赖注入。 - 针对AOP的切面类,定义了通知(advice)并指定了切入点(pointcut)。 - 使用...
Spring Framework Master分支则意味着这个压缩包包含了Spring框架的最新源码,开发者可以深入研究其内部机制,进行二次开发或者学习Spring的设计思想。 总的来说,"spring-aop-4.2.6.RELEASE.zip"及其关联的"spring...
在给定的文件中,`pom.xml`可能包含了Spring AOP相关的依赖配置,而`src`目录则包含了源代码,可能包括了切面类、业务逻辑类以及相关的配置文件。通过分析这些文件,我们可以深入了解Spring AOP如何在实际项目中应用...
Spring源代码解析(五):Spring AOP获取Proxy.doc Spring源代码解析(六):Spring声明式事务处理.doc Spring源代码解析(七):Spring AOP中对拦截器调用的实现.doc Spring源代码解析(八):Spring驱动Hibernate的...
文件“SpringAOP3”可能是相关的代码示例或者案例研究,可能包含了如何创建和应用切面、定义通知和切入点的代码片段。这部分内容有助于读者通过实际操作加深对Spring AOP的理解。 总的来说,Spring AOP是Spring框架...