Spring AOP(二) — 底层组件

 Spring AOP 是通过动态代理的方式来实现,主要是通过Pointcut、Advice、Advisor及ProxyFactoryBean 等接口来创建代理对象。

在IoC容器中,Advice 是一个bean(这样可以在通知中使用其他的bean),而Pointcut虽然不是一个Bean,但是它所在的Aspect(切面)是一个bean。

推荐Spring AOP在IoC容器中通过@AspectJ注解的形式来使用。

1 Pointcut

Pointcut 接口定义了一个或一组连接点的集合,用于匹配符合的方法。可以被复用,通常与通知(Advice)一起使用。

该接口通常不是由开发者直接实现,而是通过Spring AOP提供的切点表达式来定义(例如,@Pointcut)。

图 Pointcut 接口 UML

1.1 MethodMatcher 与 ClassFilter

切点由这两部分组成。

ClassFilter: 限制切入点或引入到给定目标类集的筛选器。

MethodMatcher: 检查目标方法是否符合Advice的条件。

图 ClassFilter 接口 UML

图 MethodMatcher 接口 UML

MethodMatcher 可以用来匹配静态及动态(匹配特定调用参数)的方法。

如果isRuntime() 方法返回false,表示只匹配静态方法。那么将调用matches带两个参数的方法。

如果 isRuntime() 返回true 并且matches带两个参数的方法返回true,那么matches带三个参数的方法将会被调用。

1.2 静态与动态Pointcut

静态切点:用于匹配方法及目标类,不能匹配特定的参数。实际开发中,大都是静态切点。Spring只需对静态切点求值一次。

动态切点:匹配方法的静态信息及参数值信息。性能耗费比静态切点大得多。Spring需要每次对它进行求值,且不能缓存结果。代表类是ControlFlowPointcut。

1.2.1 AspectJExpressionPointcut

是用于表示基于AspectJ表达式的切点的类型。是Spring AOP对AspectJ切点表达式支持的一部分。允许你使用AspectJ风格的切点来定义切点。

图 AspectJExpressionPointcut UML

图 AspectJExpressionPointcut 实现Pointcut接口的方法

AspectJExpressionPointcut 通过表达式来生成对应的ClassFilter与MethodMatcher。

2 Advice

每一个Advice 在IoC容器中都是一个bean,一个Advice实例可以被所有的目标对象访问,也可以让不同的目标对象访问该Advice的不同实例。这种模式成为Per-class 及 Per-instance 模式。

Per-class: 是最常用的类型,只对方法及参数器作用。适合那些不需要依赖目标类状态或不需要引入新的状态的情况,即不是引入。

Per-instance: 适合引入、支持混合。该类通知可以为目标类添加新的状态。

2.1 Advice 的类型

Advice的类型有Before、After(After returning及After throwing)及Around。“引入”也是一个特殊的Advice。Spring 为这些类型提供了不同的接口。

2.1.1 Before Advice

图 MethodBeforeAdvice UML

AspectJMethodBeforeAdvice 是封装了AspectJ 的Before Advice的一个通知。

图 AspectJMethodBeforeAdvice UML

2.1.2 Around Advice

org.aopalliance.intercept.MethodInterceptor 接口常用来实现Around 通知。允许你在运行时拦截并修改方法调用。

图 MethodInterceptor UML

其实现类需实现invoke方法,并调用MethodInvocation的proceed方法来执行需要增强的方法。

class TracingInterceptor implements MethodInterceptor {Object invoke(MethodInvocation i) throws Throwable {System.out.println("method "+i.getMethod()+" is called on "+i.getThis()+" with args "+i.getArguments());Object ret=i.proceed();System.out.println("method "+i.getMethod()+" returns "+ret);return ret;}}

2.1.3 Introduction Advice

“Introduction” 引入允许向目标对象动态地添加新的接口和方法,从而改变其类型。在创建代理对象时,代理对象会实现新的接口。

DeclareParentsAdvisor 用于实现@DeclareParents 注解的引入操作。

图 DeclareParentsAdvisor UML

typePatternClassFilter 用来过滤哪些目标类需要被引入。而advice则是用来实现引入的接口。getInterfaces则是返回需要被引入的接口。在其一个构造器中,传入给advice字段的类型IntroductionInterceptor。

图 IntroductionInterceptor UML

implementsInterface方法用于判断当前Advice是否实现了给定的接口。

3 ProxyFactoryBean

是Spring AOP中用于创建代理对象的一个工厂类。允许用户通过配置的方式来创建AOP代理。

@Component
public class CustomBeforeAdvice implements MethodBeforeAdvice {@Overridepublic void before(Method method, Object[] args, Object target) throws Throwable {System.out.println("------------------自定义before通知------------------");System.out.println("方法名:" + method.getName());System.out.println("参数:" + Arrays.asList(args));System.out.println("目标对象:" + target);}
}@Service
public class UserService {public void showInfo() {System.out.println("userService");}public void showName(String name) {System.out.println("name:" + name);}
}@Configuration
@ComponentScan(basePackages = {"aop2.factory"})
public class FactoryConfiguration {@Beanpublic ProxyFactoryBean userServiceProxy(UserService userService) {ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean();proxyFactoryBean.setTarget(userService);proxyFactoryBean.setInterceptorNames("customBeforeAdvice");return proxyFactoryBean;}public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(FactoryConfiguration.class);UserService proxyObj = (UserService) context.getBean("userServiceProxy");proxyObj.showInfo();proxyObj.showName("黄先生");}
}

可以设置ProxyFactoryBean的属性来控制生产代理对象的机制。

proxyTargetClass

如果为true,则强制使用CGLIB代理。

optimize

控制是否将主动优化应用通过CGLIB创建的代理。

forzen

一旦对象被初始化,其配置就不能被修改。

exposeProxy

为true时,原始代理对象会被注入到目标对象中。这样目标对象就可以通过某种机制访问到代理对象自身。

proxyInterfaces

指定代理对象应该实现的接口。

interceptorNames

指定应该应用到代理对象上的通知名称。

sigleon

用于指定代理是否时单例。

表 ProxyFactoryBean 的属性

3.1 ProxyFactory

如果不想在IoC容器中使用AOP,则可以使用ProxyFactory 来创建代理。

ProxyFactory factory = new ProxyFactory(myBusinessInterfaceImpl);
factory.addAdvice(myMethodInterceptor);
factory.addAdvisor(myAdvisor);
MyBusinessInterface tb = (MyBusinessInterface) factory.getProxy();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/520343.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLO v1讲解

YOLO是最经典的一阶目标检测框架,记录一下v1思路。 整体流程 输入数据一张 448 448 3 448 \times 448 \times 3 4484483 的图片,切分成 7 7 7 \times 7 77 的网格将图片经过多层CNN,下采样得到 7 7 30 7 \times 7 \times 30 7730 的f…

JVM-对象创建与内存分配机制深度剖析 3

JVM对象创建过程详解 类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个 符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。 new…

在分布式环境中使用状态机支持数据的一致性

简介 在本文中,我们将介绍如何在分布式系统中使用transaction以及分布式系统中transaction的局限性。然后我们通过一个具体的例子,介绍了一种通过设计状态机来避免使用transaction的方法。 什么是数据库transaction Transaction是关系型数据普遍支持的…

Threejs着色器(GPU)编程——感温管网

管网,作为支撑现代城市运转的重要基础设施,是隐藏在地面之下的庞大工程网络。这些管网如同城市的血脉,负责输送各种必要的资源,如水源、热力、燃气等,同时排除废水和其他废弃物。然而,由于其位于地下,人们往往难以直接感知其存在和运行状态。为了保障这些地下管网的安全…

现货白银实时行情的简单和复杂的判断

投资者要进行现货白银实时行情的判断,就需要有一个判断原则或者判断的系统。而这个判断的基础,有所谓的简单判断和复杂判断。那现货白银实时行情的简单和复杂的判断有何区别呢? 先说一下简单判断。现货白银实时行情的简单判断,主要…

yolov9网络结构图

文章目录 配置文件主干分支backbone预测头headyolov9网络结构图 系列文章目录 论文链接:👿 YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information代码链接:👿 https://github.com/WongKinYiu/yolov9…

GAN 网络的损失函数介绍代码

文章目录 GAN的损失函数介绍1.L1 losses2.mse loss3.smooth L14.charbonnier_loss5.perceptual loss (content and style losses)6.Gan损失7.WeightedTVLoss8.完整代码方便使用,含训练epoch代码。 GAN的损失函数介绍 1.L1 losses pixel_opt: type: L1Loss loss_weight: 1.0 r…

新书速览|PyTorch语音识别实战(人工智能技术丛书)

实战语音唤醒、音频特征抽取、语音情绪分类、Whisper语音转换、鸟叫多标签分类、多模态语音文字转换 01 本书内容 《PyTorch语音识别实战》使用PyTorch 2.0作为语音识别的基本框架,循序渐进地引导读者从搭建环境开始,逐步深入到语音识别基本理论、算法以…

linux下部署OpenCV环境(Java/SpringBoot/IDEA)

环境 本文基于Linux(CentOS 7)、SpringBoot部署运行OpenCV 4.5.5,并顺带记录Windows/IDEA下如何调试SpringBoot调用OpenCV项目。 Windows下调试 首先我们编写代码,并在Windows/IDEA下调试通过。 下载Windows版安装包&#xff0…

星辰天合参与编制 国内首个可兼顾 AI 大模型训练的高性能计算存储标准正式发布

近日,在中国电子工业标准化技术协会高标委的支持和指导下,XSKY星辰天合作为核心成员参与编制的《高性能计算分布式存储系统技术要求》团体标准,在中国电子工业标准化技术协会网站正式发布。 该团体标准强调了分布式存储系统对包括传统高性能计…

教育中的人工智能:ChatGPT只是开始

近日,智能聊天工具ChatGPT在全球掀起热潮。谷歌、微软、苹果等科技巨头纷纷宣布跟进布局,有消息称中国互联网企业将于3月在推出类似ChatGPT的人工智能聊天机器人。 对于许多学生来说,数字助手已经成为一种非正式的家庭作业助手。自1966年第一…

2016年认证杯SPSSPRO杯数学建模C题(第一阶段)如何有效的抑制校园霸凌事件的发生解题全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 C题 如何有效的抑制校园霸凌事件的发生 原题再现: 近年来,我国发生的多起校园霸凌事件在媒体的报道下引发了许多国人的关注。霸凌事件对学生身体和精神上的影响是极为严重而长远的,因此对于这些情况我们应该…