spring03-aop

  • spring aop: 只能增强方法,,spring aop 底层是动态代理,,,动态代理的本质是生成一个子类,,重写这个方法,进行增强,,所以final修饰的类和方法,,或者是static静态方法,或者是private修饰的方法,都不能被继承,都会导致spring aop 失效

  • aspectJ aop: 能增强属性,类,静态方法,,等,是一个完整的,独立的,功能十分强大的aop解决方案,,是编译时增强,,性能也高于aop,,当然也支持运行时增强

spring aop 核心概念
  • Target : 被拦截下来的对象(要被增强的对象)
  • Join Point : 连接点,,, 可以被切面插入的地方
  • Pointcut : 切点,, 被切面增强的连接点
  • Advice: 通知,切点在连接处执行的代码,增强
  • Aspect : 切面 , 通知和切点
  • Weaving : 织入,,将切面应用到 Target的过程,,可以在编译的时候weaving,也可以在类加载的时候,,也可以在运行的时候,,织入
  • introduction: 引介,,,,为某个类,增加新的方法或者属性,,,
aop的使用

定义一个增强:

public class CalculatorAdvice implements MethodBeforeAdvice {/**** @param method 当前的方法* @param args  方法参数* @param target  当前对象* @throws Throwable*/@Overridepublic void before(Method method, Object[] args, Object target) throws Throwable {System.out.println(method.getName()+" 开始执行。。。");}
}

xml中配置aop:

<bean class="com.cj.CalculatorAdvice" id="calculatorAdvice"/><bean class="com.cj.CalculatorImpl" id="calculator"/><aop:config>
<!--        拦截点,,哪些点需要被拦截execution,, 锁定方法
--><aop:pointcut id="pc" expression="execution(int com.cj.CalculatorImpl.add(int,int))"/><aop:advisor advice-ref="calculatorAdvice" pointcut-ref="pc"/></aop:config>

这个CalculatorImpl 的类被增强了,,产生了一个新的代理类,,这个容器里面的CalculatorImpl的bean,,被这个新的代理的bean替换掉了,,

  public static void main(String[] args) {ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");// 这里返回的是一个代理对象,,,并不是注入spring中的ICalculator bean = ctx.getBean(ICalculator.class);//        CalculatorImpl calculator = (CalculatorImpl) ctx.getBean("calculator");
//        System.out.println("calculator = " + calculator);bean.add(1,2);bean.minus(1,2);}

另一种配置xml:

public class LogAdvice {public void before(JoinPoint jp){// 方法名String name = jp.getSignature().getName();System.out.println(name+"开始执行。。");}public void after(JoinPoint jp){String name = jp.getSignature().getName();System.out.println(name+"执行结束。。");}public void exception(JoinPoint jp,Exception e){String name = jp.getSignature().getName();System.out.println(name+"异常。。"+e.getMessage());}/*** 目标方法的返回值,,必须和这里的参数相匹配,,,该方法才会被触发* @param jp* @param result*/public void returnAdvice(JoinPoint jp,int result){String name = jp.getSignature().getName();System.out.println(name+"返回值。。"+result);}public Object around(ProceedingJoinPoint pjp) throws Throwable {long startTime = System.currentTimeMillis();Object proceed = pjp.proceed(new Object[]{100,99});long endTime = System.currentTimeMillis();System.out.println(pjp.getSignature().getName()+"执行耗时"+(endTime-startTime));return proceed;}
}
    <bean class="com.cj.CalculatorImpl" id="calculator"/><bean class="com.cj.LogAdvice" id="logAdvice"/><aop:config><aop:pointcut id="pc" expression="execution(* com.cj.CalculatorImpl.*(..))"/><aop:aspect ref="logAdvice"><aop:before method="before" pointcut-ref="pc"/><aop:after method="after" pointcut-ref="pc"/>
<!--            throwing:设置异常的名字--><aop:after-throwing method="exception" pointcut-ref="pc" throwing="e"/><aop:after-returning method="returnAdvice" pointcut-ref="pc" returning="result"/><aop:around method="around" pointcut-ref="pc"/></aop:aspect></aop:config>

java代码配置aop:使用<aop:aspectj-autoproxy/>自动扫描带@Aspect的切面

/***** aspect =  pointcut + advice**/
@Aspect
public class LogAspect {@Pointcut("execution(* com.cj.CalculatorImpl.*(..))")public void pc1(){}@Before("pc1()")public void before(JoinPoint jp){// 方法名String name = jp.getSignature().getName();System.out.println(name+"开始执行。。");}@After("pc1()")public void after(JoinPoint jp){String name = jp.getSignature().getName();System.out.println(name+"执行结束。。");}@AfterThrowing(value = "pc1()",throwing = "e")public void exception(JoinPoint jp,Exception e){String name = jp.getSignature().getName();System.out.println(name+"异常。。"+e.getMessage());}/*** 目标方法的返回值,,必须和这里的参数相匹配,,,该方法才会被触发* @param jp* @param result*/@AfterReturning(value = "pc1()",returning = "result")public void returnAdvice(JoinPoint jp,int result){String name = jp.getSignature().getName();System.out.println(name+"返回值。。"+result);}@Around("pc1()")public Object around(ProceedingJoinPoint pjp) throws Throwable {long startTime = System.currentTimeMillis();Object proceed = pjp.proceed(new Object[]{100,99});long endTime = System.currentTimeMillis();System.out.println(pjp.getSignature().getName()+"执行耗时"+(endTime-startTime));return proceed;}
}
    <bean class="com.cj.CalculatorImpl" id="calculator"/><bean class="com.cj.LogAspect" id="aspect"/><!--    会扫描到有@Aspect注解 --><aop:aspectj-autoproxy/>

纯java类写法:
需要在切面上添加注解@EnableAspectJAutoProxy,这个注解是用来识别切面的,相当于在xml中配置<aop:aspectj-autoproxy>

@Aspect
@Component
// 这个注解是用来识别切面的,,相当于<aop:aspectj-autoproxy/>
@EnableAspectJAutoProxy
public class LogAspect {
...
}
@Configuration
@ComponentScan
public class JavaConfig {
}
spring aop 动态代理

如果有接口,用的jdk动态代理,,
没有接口,用的cglib动态代理

如果有接口,但是你不想使用jdk动态代理,而是使用cglib,,在@EnableAspectJAutoProxy 设置proxyTargetClass=true 就会使用cglib代理

spring aop拦截
  • execution : 零侵入的拦截规则
  • 注解
    @annotation():方法上面有这个注解
    @within() : 类上面有这个注解

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

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

相关文章

0121__线程 thread_once

线程 thread_once_thraed once-CSDN博客

QCOM 平台增加分区流程 及 注意事项

本文以qcom msm8909 为例增加carrier分区&#xff0c;留文以备后忘&#xff1a; 1、修改分区表partition.xml diff --git a/non_hlos/common/config/emmc/partition.xml b/non_hlos/common/config/emmc/partition.xml index 74ca036..11f38bc 100755 --- a/non_hlos/common/con…

家用洗地机十大品牌什么牌子好用?2024十大爆款洗地机分享

在快节奏的生活中&#xff0c;清洁家居成为了一项繁琐却必不可少的任务。而洗地机的出现&#xff0c;无疑给忙碌的都市人带来了福音。选择一款优质的洗地机可以大大提升我们清洁的效率&#xff0c;改善我们的生活品质。那么&#xff0c;哪家洗地机清洁力最强&#xff0c;更适合…

ONLYOFFICE 桌面编辑器 8.1 版发布:全面提升文档处理效率的新体验

文章目录 什么是ONLYOFFICE &#xff1f;ONLYOFFICE 桌面编辑器 8.1 发布&#xff1a;新功能和改进功能强大的 PDF 编辑器幻灯片版式功能从右至左语言支持多媒体功能增强无缝切换工作模式其他改进和优化总结 什么是ONLYOFFICE &#xff1f; https://www.onlyoffice.com/zh/off…

JavaScript的学习之图片的切换

目录 一、寻找素材 二、编写简单的静态html页面 代码示例 效果展示 三、JS功能的实现 JS代码 完整代码 效果展示 一、寻找素材 随便去网上找几张图片素材 二、编写简单的静态html页面 代码示例 <!doctype html> <html><head><meta charset"…

svn明明都在环境变量中添加了,但还是无法在cmd中生效

svn明明都在环境变量中添加了&#xff0c;但还是无法在cmd中生效 cmd显示原因问题解决 cmd显示 svn不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件 原因 安装svn一直点下一步下一步…&#xff0c;没有勾选command line client。 问题解决 1.按下winx&…

Linux CMakeLists编写之静态库

目录 1 概述2 文件命名3 实例4 代码分析 1 概述 编译工具有很多(make/cmake/BJam)。cmake是跨平台&#xff0c;使用cmake编译需要编写CMakeLists.txt。本文编写CMakeLists.txt来生成C静态库。 2 文件命名 文件命名为CMakeLists.txt,是一个文本文件,可以使用任何编辑器编辑。 …

如何加密电脑文件?电脑重要文件怎么加密?

在电脑中&#xff0c;我们会存储很多重要文件&#xff0c;包括个人隐私视频、照片&#xff0c;企业机密数据&#xff0c;工作数据等。为了避免重要文件泄露&#xff0c;我们需要加密保护电脑文件。下面我们就来了解一下电脑文件怎么加密&#xff1f; 超级加密3000 当需要加密电…

[其他]MBTI各个字母分表代表什么

一、什么是MBTI&#xff1f; MBTI&#xff08;Myers-Briggs Type Indicator&#xff09;&#xff0c;一种迫选型、自我报告式的性格评估测试&#xff0c;用以衡量和描述人们在获取信息、作出决策、对待生活等方面的心理活动规律和性格类型。 二、MBTI各字母含义 MBTI倾向显示…

赶紧收藏!2024 年最常见的操作系统面试题(六)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见的操作系统面试题&#xff08;五&#xff09;-CSDN博客 十一、什么是I/O操作&#xff1f;请解释缓冲I/O和直接I/O的区别。 I/O操作&#xff0c;即输入/输出操作&#xff0c;是计算机科学中指数据在计算机系统内部和外…

Python语法基础三

12.range()函数 python 的 range() 函数可用来创建一个整数列表&#xff0c;一般用在 for 循环中. **range()语法&#xff1a;**range(start, stop[, step])**start&#xff1a;**计数从start开始,默认是从0开始(闭区间),如:range(5)等价于range(0,5).**stop&#xff1a;**计…

vue 实现 word/excel/ppt/pdf 等文件格式预览操作

效果图&#xff1a; 问题描述&#xff1a;一般情况下使用iframe标签就可以实现文件预览&#xff0c;但是这个标签只针对于ppt和pdf是有效的。对于doc文件就需要借助第三方插件&#xff08;vue-office/docx&#xff09;来实现预览了。下面介绍使用方法。 安装插件&#xff1a;n…

Lua C API

Lua 5.4 Reference Manual - contents官方网站

力扣爆刷第155天之TOP100五连刷41-45(下一个排列、正序数组中位数、归并排序链表)

力扣爆刷第155天之TOP100五连刷41-45&#xff08;下一个排列、正序数组中位数、归并排序链表&#xff09; 文章目录 力扣爆刷第155天之TOP100五连刷41-45&#xff08;下一个排列、正序数组中位数、归并排序链表&#xff09;一、31. 下一个排列二、4. 寻找两个正序数组的中位数三…

量化交易策略:定义及其重要性

量化交易是华尔街和硅谷的秘密结合点&#xff0c;在这里数学和算法与金钱和市场相遇。虽然它曾经是金融巨头的专属领域&#xff0c;但现在它比以往任何时候都更易于接触。 但不要被愚弄&#xff0c;量化交易仍然是一种高速、高压的游戏&#xff0c;在毫秒间可以赚到或失去财富…

FlashST 短期交通预测领域的插件式创新

FlashST: A Simple and Universal Prompt-Tuning Framework for Traffic Prediction&#xff1a;一篇在短期交通预测领域的插件式创新&#xff0c;主要解决不同数据集和任务下的分布漂移问题。 方法&#xff1a;采用二阶段训练的方法&#xff0c;一阶段在PEMS03478数据集上进行…

STM32CubeIDE复制工程文档

目录 1. 粘贴复制2. 重命名 1. 粘贴复制 复制粘贴 重命名&#xff0c;别重名&#xff0c;点击- copy 结果 2. 重命名 重命名 ioc文件 编译 OK

IDEA 安装与激活详细教程最新(附最新激活码)2099年亲测有效!

我们先从 IDEA 官网下载 IDEA 2024.1 版本的安装包&#xff0c;下载链接如下&#xff1a; https://www.jetbrains.com/idea/download/ 点击下载(下载Ultimate版)&#xff0c;静心等待其下载完毕即可。 激活方式&#xff1a; 正版专属激活码领取

教程:Spring Boot中如何集成GraphQL

教程&#xff1a;Spring Boot中如何集成GraphQL 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 引言 随着现代应用程序的复杂性增加&#xff0c;API的设计和…

基本的网络设备:集线器、中继器、网桥、交换机、路由器、防火墙等

基本的网络设备&#xff1a;集线器、中继器、网桥、交换机、路由器、防火墙等 基本功能、原理、优缺点集线器&#xff08;Hub&#xff09;中继器&#xff08;Repeater&#xff09;网桥&#xff08;Bridge&#xff09;交换机&#xff08;Switch&#xff09;路由器&#xff08;Ro…