spring源码系列-AOP的项目结构解析
上一篇播客已经阐述了AOP的同用的接口方法定义。但是真正的aop实现方法 远远不止这个。这篇文章就专门介绍整个框架aop的代码结构。
spring源码系列-AOP的项目结构解析
前言
我们看代码更多是学习spring的代码思想,设计方式(设计模式) 同时当你知道了整个代码结构。就知道哪一块是干啥的。以后遇到问题,也可以很快定位。
aop包
包含的内容:
核心 Spring AOP 接口,建立在 AOP 联盟 AOP通用接口之上。
任何 AOP 联盟
MethodInterceptor 都可以在 Spring 中使用。
Spring AOP 还提供:
- Introduction support
- 一个切入点抽象,支持“静态”切入点(基于类和方法)和“动态”切入点(也考虑方法参数)。当前没有用于切入点的 AOP 联盟接口。
- 全方位的通知类型,包括around、before、afterreturns和throws通知。
- 可扩展性允许在不修改核心框架的情况下插入任意自定义建议类型。
Spring AOP 可以以编程方式使用或(最好)与 Spring IoC 容器集成。
aop.aspectj包
AspectJ 集成包。包括 AspectJ 5 注释样式方法的 Spring AOP 建议实现,以及
AspectJExpressionPointcut:一个 Spring AOP 切入点实现,它允许将 AspectJ 切入点表达式语言与
Spring AOP 运行时框架一起使用。请注意,使用此包不需要需要使用 {@code ajc} 编译器或
AspectJ 加载时编织器。它旨在通过基于代理的 Spring AOP 框架,使用具有一致语义的 AspectJ 功能的重要子集。
aop.aspectj.annotation包
使 AspectJ 5 @Annotated 类能够在 Spring AOP 中使用的类。
通常通过 AspectJAutoProxyCreator 而不是直接使用。
aop.aspectj.autoproxy包
基于 AspectJ 启用自动代理的基类。
对 AspectJ 注释方面的支持驻留在“aspectj.annotation”包中。
aop.config包
声明式 AOP 配置的支持包,XML 模式是主要的配置格式。
因为spring的配置基本都是xml配置的
aop.framework包
包含 Spring 基本 AOP 基础结构的包,符合 AOP Alliance 接口。
Spring AOP 支持代理接口或类、介绍,并提供静态和动态切入点。
任何 Spring AOP 代理都可以投到这个包中的 ProxyConfig AOP 配置接口来添加或删除拦截器。
ProxyFactoryBean 是一种在 BeanFactory 或 ApplicationContext 中创建 AOP 代理的便捷方式。但是,可以使用 ProxyFactory 类以编程方式创建代理。
aop.framework.adapter包
允许 Spring AOP 框架处理任意通知类型的 SPI 包。
只想使用 Spring AOP 框架而不是扩展其功能的用户不需要关心这个包。
您可能希望使用这些适配器在 MethodInterceptor 中包装 Spring 特定的建议,例如 MethodBeforeAdvice,以允许它们在支持 AOP 联盟接口的另一个 AOP 框架中使用。
这些适配器不依赖于任何其他 Spring 框架类来允许此类使用。
这里插一句:SPI 是一种服务发现机制。这里不展开。
aop.framework.autoproxy包
在 ApplicationContexts 中使用的 Bean 后处理器通过自动创建 AOP 代理来简化 AOP 的使用,而无需使用 ProxyFactoryBean。
此包中的各种后处理器只需添加到 ApplicationContext(通常在 XML bean 定义文档中)即可自动代理选定的 bean。
NB:BeanFactory 实现不支持自动自动代理,因为后处理器 bean 仅在应用程序上下文中自动检测。可以在 ConfigurableBeanFactory 上显式注册后处理器。
aop.interceptor包
提供各种拦截器实现。更具体的拦截器可以在相应的功能包中找到,比如“transaction”和“orm”。
aop.scope包
支持基于 AOP 的目标对象范围,具有可配置的后端。
aop.support包
使用 Spring 的 AOP API 的便利类。
aop.support.annotation包
对 AOP 切入点的注释支持。
总结
通过这篇文章,我们能大致可以知道每个包下的存放的类的用途。
接下来我们就来看一下具体的流程是怎么样的。