11.AOP术语和操作
AOP 术语
1、连接点
类里面哪些方法可以被增强,这些方法称为连接点
2、切入点
实际被真正增强的方法,称为切入点
3、通知(增强)
1)实际增强的逻辑部分称为通知(增强)
2)通知有多种类型
前置通知、后置通知、环绕通知、异常通知、最终通知
4、切面
切面是动作,把通知应用到切入点的过程
AOP 操作
1、 Spring 框架一般都是基于 AspectJ 实现 AOP 操作
(1) AspectJ 不是 Spring 组成部分,独立 AOP 框架,一般把 AspectJ 和 Spirng 框架一起使用,进行 AOP 操作
2、基于 AspectJ 实现 AOP 操作
(1)基于 xml 配置文件实现
(2)基于注解方式实现(常用)
3、切入点表达式
(1)切入点表达式作用:知道对哪个类里面的哪个方法进行增强
(2)语法结构: execution([权限修饰符] [返回类型] [类全路径] 方法名称 )
举例 1:对 com.leizi.dao.BookDao 类里面的 add 进行增强 execution(* com.leizi.dao.BookDao.add(..)) 举例 2:对 com.leizi.dao.BookDao 类里面的所有的方法进行增强 execution(* com.leizi.dao.BookDao.* (..)) 举例 3:对 com.atguigu.dao 包里面所有类,类里面所有方法进行增强 execution(* com.leizi.dao.*.* (..))
execution(* cn.itcast.procject.service..*.*(..)) * :返回类型任意 cn.itcast.procject.service :包及其子包中所有类,类中所有方法,参数任意
过程
1.在增强类上面添加注解 @Aspect @Component @Aspect //生成代理对象 public class UserProxy { }
xml形式
在 spring 配置文件中开启生成代理对象 <!-- 开启 Aspect 生成代理对象--> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
JDK代理(默认):<aop:aspectj-autoproxy proxy-target-class="false"/> cglib代理:proxy-target-class="true" <!--开启注解支持--> <!--proxy-target-class="false"使用JDK代理(默认) proxy-target-class="true"使用cglib代理--> <aop:aspectj-autoproxy proxy-target-class="false"/> <context:component-scan base-package="com.stt.diy"/>
配置不同类型的通知
AspectJ提供不同的通知类型:
Before: 前置通知,相当于BeforeAdvice AfterReturning: 后置通知,相当于AfterReturningAdvice Around: 环绕通知,相当于MethodInterceptor AfterThrowing: 抛出通知,相当于ThrowAdvice After: 最终final通知,不管是否异常,该通知都会执行 DeclareParents: 引介通知,相当于IntroductionInterceptor (不要求掌握)
(1)在增强类的里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置
//增强的类 @Component @Aspect //生成代理对象 public class UserProxy { //前置通知 //@Before 注解表示作为前置通知 @Before(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))") public void before() { System.out.println("before........."); } //后置通知(返回通知) @AfterReturning(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))") public void afterReturning() { System.out.println("afterReturning........."); } //最终通知 @After(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))") public void after() { System.out.println("after........."); } //异常通知 @AfterThrowing(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))") public void afterThrowing() { System.out.println("afterThrowing........."); } //环绕通知 @Around(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))") public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("环绕之前........."); //被增强的方法执行 proceedingJoinPoint.proceed(); System.out.println("环绕之后........."); } }
相同的切入点抽取
//相同切入点抽取 @Pointcut(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")public void pointdemo() { } //前置通知 //@Before 注解表示作为前置通知,value为抽取的切入点方法签名 @Before(value = "pointdemo()") public void before() { System.out.println("before........."); }
有多个增强类多同一个方法进行增强,设置增强类优先级
(1)在增强类上面添加注解 @Order(数字类型值),数字类型值越小优先级越高
@Component @Aspect @Order(1) public class PersonProxy
xml形式aop操作:
在 spring 配置文件中配置切入点
<!--创建对象--> <bean id="book" class="com.leizi.spring5.aopxml.Book"></bean> <bean id="bookProxy" class="com.leizi.spring5.aopxml.BookProxy"></bean> <!--配置 aop 增强--> <aop:config> <!--切入点--> <aop:pointcut id="p" expression="execution(* com.leizi.spring5.aopxml.Book.buy(..))"/> <!--配置切面--> <aop:aspect ref="bookProxy"> <!--增强作用在具体的方法上--> <aop:before method="before" pointcut-ref="p"/> </aop:aspect> </aop:config>
完全使用注解开发
(1)创建配置类,不需要创建 xml 配置文件
@Configuration @ComponentScan(basePackages = {"com.atguigu"}) @EnableAspectJAutoProxy(proxyTargetClass = true) public class ConfigAop { }
本文来自博客园,作者:Lz_蚂蚱,转载请注明原文链接:https://www.cnblogs.com/leizia/p/14959412.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步