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 {
    @Override
    public 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 {

    @Bean
    public 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.mfbz.cn/a/435298.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【官宣】2024广州国际酒店工程家具及商业空间展览会

2024广州国际酒店工程家具及商业空间展览会 Guangzhou International Hotel Engineering Furniture and commercial space exhibition 2024 时间:2024年12月19-21日 地点:中国进出口商品交易会展馆 承办单位:广州佛兴英耀展览服务有…

同步服务器操作系统公网仓库到本地 _ 统信UOS _ 麒麟KYLINOS

原文链接:同步服务器操作系统公网仓库到本地 | 统信UOS | 麒麟KYLINOS 在如今快速发展的信息技术时代,维护和更新服务器操作系统变得越来越重要。无论是为了提高安全性、增加新功能还是提升系统稳定性,同步公网源仓库到本地都是一个关键步骤。…

Flask入门三(Flask-session的使用、数据库链接池、wtforms、Flask定制命令、Flask-Cache)

文章目录 一、Flask-session使用1.使用方式一2.使用方式二3.读RedisSessionInterface源码4.flask-session补充 二、数据库连接池1.flask中使用mysql2.上述问题解决 使用数据库连接池1.第三方数据库连接池2.操作数据库不带池版3.池版和非池版压测 三、wtforms四、Flask定制命令1…

数据结构部分

来源地址 一 数据结构 1 堆和树之间的区别 区别就在于树是没有特定顺序的,你需要遍历整个树才能找到特定元素;而堆是有序的,你可以直接找到最大(或最小)的元素。 堆:假设你正在开发一个任务调度系统&…

IOS使用Unity容器动态加载3D模型

项目背景 我们的APP是一个数字藏品平台,里面的很多藏品需要展示3D模型,3D模型里面可能会包含场景,动画,交互。而对应3D场景来说,考虑到要同时支持iOS端,安卓端,Unity是个天然的优秀方案。 对于Unity容器来说,需要满足如下的功能: 1.在APP启动时,需要满足动态下载最…

CCF-A推荐会议 安全界顶会ACM CCS‘24 4月29日第二轮投稿!共建更安全的数字世界!

会议之眼 快讯 第31届ACM CCS (ACM Conference on Computer and Communications Security)即计算机和通信安全会议将于 2024 年 10月14日-18日在美国盐湖城举行!CCS是美国计算机协会(ACM)安全、审计与控制特别兴趣小组(SIGSAC)主办的一年一度的重要会议。是SIGSAC的…

每周一练--[NewStarCTF 2023 公开赛道]Final

很明显又是ThinkPHP的漏洞,上周还做过类似的。 先看看是哪一个版本的。 得到版号后,去找找payload。 (post)public/index.php?scaptcha (data) _method__construct&filter[]system&methodget&server[REQUEST_METHOD]ls -al 这其…

PDF控件Spire.PDF for .NET【安全】演示:加密 PDF 文档

加密PDF是人们常用的保护PDF的方法。无论对于公司还是个人,使用PDF加密来设置一些限制都是必不可少的。为了使PDF文档可供未经授权的用户阅读但无法修改,加密的PDF文档需要两个密码:所有者密码和用户密码。本节将特别介绍一种通过 Spire.PDF …

政安晨:【深度学习处理实践】(一)—— 卷积神经网络入门

深度学习的卷积神经网络(Convolutional Neural Network,简称CNN)是一种广泛应用于图像识别、计算机视觉和自然语言处理等领域的深度学习模型。 CNN的主要特点是它能够自动从原始数据中学习特征表示,而无需手动特征工程。这是通过…

2024经济管理、互联网技术与数据分析国际会议(EMITDA2024)

2024经济管理、互联网技术与数据分析国际会议(EMITDA2024) 一、【会议简介】 2024经济管理、互联网技术与数据分析国际会议(EMITDA2024)旨在汇集来自全球各地的专家、学者和业界领袖,共同探讨经济管理、互联网技术和数据分析领域的最新研究成…

【漏洞复现】网康科技 NS-ASG 应用安全网关 SQL注入漏洞(CVE-2024-2022)

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

【开源】JAVA+Vue.js实现企业项目合同信息系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 合同审批模块2.3 合同签订模块2.4 合同预警模块2.5 数据可视化模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 合同审批表3.2.2 合同签订表3.2.3 合同预警表 四、系统展示五、核心代码5.1 查询合同…

[CSAWQual 2019]Web_Unagi ---不会编程的崽

不知道刷了多少天了,又是一题关于xxe漏洞的。 web的习惯性操作。 1.功能点&cms 2.源代码 3.敏感文件泄露 当然这是我个人的习惯。这里进入界面后又upload功能,不会是传马吧。但是旁边给了上传文件格式。仅仅只看界面似乎没什么区别,源…

985硕的4家大厂实习与校招经历专题分享(part2)

我的个人经历: 985硕士24届毕业生,实验室方向:CV深度学习 就业:工程-java后端 关注大模型相关技术发展 校招offer: 阿里巴巴 字节跳动 等10 研究生期间独立发了一篇二区SCI 实习经历:字节 阿里 京东 B站 (只看大厂,面试…

Leetcode刷题(二十)

一、45. 跳跃游戏 II 代码&#xff1a; class Solution:def jump(self, nums: List[int]) -> int:start step 0end 1n len(nums)while end < n:max_num 0for i in range(start,end):max_num max(max_num, inums[i])start,end,step end,max_num 1,step1return st…

水库大坝安全评价导则:大坝运行管理评价

一、一般规定 1、大坝运行管理评价的目的是&#xff0c;为安全鉴定提供大坝的运行、管理及性状等基础资料&#xff0c;作为大坝安全综合评价及分类的依据之一。 2、大坝运行管理评价的内容包括大坝运行、维修和监测。 3、大坝运行管理的各项工作应按相应的规范&#xff0c;结合…

卢晶:智能座舱中的音频交互技术 | 演讲嘉宾公布

一、智能车载音频 I 分论坛 智能车载音频 I 分论坛将于3月27日同期举办&#xff01; 我们正站在一个前所未有的科技革新的交汇点上&#xff0c;重塑我们出行体验的变革正在悄然发生。当人工智能的磅礴力量与车载音频相交融&#xff0c;智慧、便捷与未来的探索之旅正式扬帆起航…

Claude 3 Sonnet 模型现已在亚马逊云科技的 Amazon Bedrock 正式可用!

今天&#xff0c;我们宣布一个激动人心的里程碑&#xff1a;Anthropic 的 Claude 3 Sonnet 模型现已在亚马逊云科技的 Amazon Bedrock 正式可用。 下一代 Claude (Claude 3) 的三个模型 Claude 3 Opus、Claude 3 Sonnet 和 Claude 3 Haiku 将陆续登陆 Amazon Bedrock。Amazon …

猛攻生态,鸿蒙单挑安卓

文&#xff5c;刘俊宏 编&#xff5c;王一粟 这回轮到鸿蒙禁用安卓了。 1月18日&#xff0c;鸿蒙生态千帆仪式上&#xff0c;华为正式宣布了HarmonyOS NEXT&#xff08;下简称鸿蒙星河版或纯血鸿蒙&#xff09;开发者预览已向开发者开放申请&#xff0c;纯血鸿蒙开始走向普及…

Kap - macOS 开源录屏工具

文章目录 关于 Kap 关于 Kap Kap 是一个使用web技术的开源的屏幕录制工具 官网&#xff1a;https://getkap.cogithub : https://github.com/wulkano/Kap 目前只支持 macOS 12 以上&#xff0c;支持 Intel 和 Apple silicon 你可以前往官网&#xff0c;右上方下载 你也可以使…