面向切面编程及其注解

冉兵成 冉兵成     2022-08-02     794

关键词:

AOP面向方面/面向切面变成

AOP将分散在系统中的功能块放到一个地方- 切面

可以声明式的定义何时何地应用这些功能,而不是在需要新功能的地方修改代码

好处
每个业务逻辑放在一个地方,不是分散到代码各个角落。业务模块只包含核心功能,辅助功能转到切面中,使其更加清晰。
关注的是共同处理。通过spring配置把某个作用应用到多个点上。提高灵活性

 

重要术语
切面(Aspect):就是你要实现的交叉功能---共通业务处理可以被切入到多个目标对象。并且多次使用
连接点(Joinpoint):应用程序执行过程中插入切面的地点
通知(Advice):通知切面的实际实现
切入点(Pointcut):定义通知应用在哪些连接点---连接点的集和
目标对象(Target Object):被通知的对象,也就是目标对象
代理(Proxy):将通知应用到目标对象后创建的对象---AOP中容器返回的对象是代理对象。用户在使用的时候,由代理对象调用切面组件和目标对象的功能
织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程


我们进入案例01---需要引入额外jar包,这点要注意通过实验慢慢引入
 1:编写dao类用来进行正常的增删改查
 2:编写切面用于共同业务处理---记录日志
 3:编写我们的xml文件
 <aop:config>
  <aop:pointcut id="userPointCut"
   expression="execution(* com.wode.service.UserService.*(..))" />
  <aop:aspect id="logAspect"  ref="userLogger">
   <aop:before method="testLogger" pointcut-ref="userPointCut"></aop:before>
  </aop:aspect> 
 </aop:config>

重要概念:
 <aop:config>---指的是需要进行AOP配置了

 <aop:pointcut id="userPointCut"
   expression="execution(* com.wode.service.UserService.*(..))" />----设置切面
  expression这个用于设置规则
  execution--具体规则类容 我们现在设置的就是不用管返回值+包类.*(所有方法)不限定参数类型
   我们可以做这样的实验
    01:expression="execution(* com.wode.service.UserService.delete(..))"
    02:expression="execution(void com.wode.service.UserService.*(..))" />
     看看有什么不一样
  这里是使用的切入点表达式我们可以看一下规则-参考网站可以参照一下表达式.txt从网上下载的
 注意我们还可以使用一种within的方式
 within用于匹配指定类型内的方法执行--这里和上边对应上边用于指定方法(更灵活)
 例如<aop:pointcut id="userPointCut" expression="within(com.wode.service.UserService)" />和上边的就一个意思
 within(com.wode.service.*)---包下边所有的方法
 within(com.wode.service..*)这样写的话就包括了子包  

 <aop:aspect>--用于配置切面
  id---起id名称
  ref--指向我们的切面文件
  <aop:before method="testLogger" pointcut-ref="userPointCut"></aop:before>--指定方法以及在什么时候发生以及他的切入点

 

注意除了aop:before是指在之前发生,这里总共有这么多类型可以让我们选择

默认提供通知类型
 <aop:before>---前置通知
 <aop:afterreturning>方法调用之后,但是如果有异常将不通知
 <aop:after>最终通知
 <after-throwing>方法调用发生异常之后
 <aop:around>环绕通知,也就是方法之前和之后

分步骤测试 演示前置和后置通知

这里需要注意的是Around他相当于之前所有返回的结合体,需要注意的是它的返回值异常-----方法返回值和我们切面的返回值

但是它非常好用,我们可以通过它通过ProceedingJoinPoint--来获取方法名、类名等等东西

演示ProceedingJoinPoint 案例
  Object obj=pjo.proceed();
  System.out.println(obj);
  System.out.println(pjo.getTarget());
  System.out.println(pjo.getArgs()[0]);
  System.out.println(pjo.getSignature().getName());
  System.out.println(pjo.getTarget().getClass().getName());


除了他之外,我们的后置通知也能获取方法的返回值需要做的
不过需要我们做的是
target
public int add(int i){
  System.out.println("增加了");
  return 99;
 }
1:在xml中做改变
<aop:after-returning method="testLoggerafetr" returning="test" pointcut-ref="userPointCut"></aop:after-returning>
2:在切面中做改变
 public void testLoggerafetr(int test) throws Throwable{
  System.out.println("后置记录日志");
  System.out.println(test);
 }

最后我们来测试异常通知aop:after-throwing
理所当然的,我们也可以在切面中获取这个异常
 <aop:after-throwing method="testLoggerException" throwing="e" pointcut-ref="userPointCut"></aop:after-throwing>
 public void testLoggerException(Exception e) throws Throwable{
  System.out.println("异常记录日志"+e);
 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

最后:福利
1:删除所有在xml中关于AOP的东西
2:加入这样一句话
 <aop:aspectj-autoproxy />
3:使用注解
 @Component("userLogger")
 @Aspect
4:定义切入点:
 @Pointcut("within(com.wode.service.UserService)")
 public void pointCut(){}
5:设置
  @Before("pointCut()")
 public void testLogger() throws Throwable{
  System.out.println("前置记录日志");
 }

 


切入点表达式第二种方式:
 @Pointcut("execution(* com.wode.service.UserService.*(..))")
 public void pointCut(){}

 

我们来看特殊的
@Around("pointCut()")
 public int testLogger(ProceedingJoinPoint pjo) throws Throwable{
  System.out.println("前置记录日志");
  Object obj=pjo.proceed();
  System.out.println(obj);
  System.out.println(pjo.getTarget());
  System.out.println(pjo.getArgs()[0]);
  System.out.println(pjo.getSignature().getName());
  System.out.println(pjo.getTarget().getClass().getName());
  return (int) obj;
 }


这里还是需要注意返回值的问题

异常通知
 @AfterThrowing(pointcut="pointCut()",throwing="e")
 public int testLogger(Exception e) throws Throwable{
  System.out.println("前置记录日志"+e);
  return  1;
 }


当然别的通知中我们需要获得参数啊什么的就可以这么做
@Before("pointCut()")
 public int testLogger(JoinPoint jpt) throws Throwable{
  System.out.println("前置记录日志");
  System.out.println(jpt.getTarget());
  return 1;
 }

 

 


 

springaop面向切面编程-后置通知

总结:Aspectj表示切面执行时间,用的通知(Advice)。这个通知可以使用注解表示。5个注解表示切面的5个执行时间,这些注解叫做通知注解。@Before:前置通知@AfterRetunring:后置通知@Around:环绕... 查看详情

springaop面向切面编程-异常+最终通知(了解)(代码片段)

...做通知注解。@Before:前置通知👉【Spring】AOP面向切面编程-前置通知(掌握)@AfterRetunring&# 查看详情

springaop面向切面编程-前置通知(代码片段)

总结:Aspectj表示切面执行时间,用的通知(Advice)。这个通知可以使用注解表示。5个注解表示切面的5个执行时间,这些注解叫做通知注解。@Before:前置通知@AfterRetunring:后置通知@Around:环绕... 查看详情

springaop面向切面编程-环绕通知(掌握)(代码片段)

总结:Aspectj表示切面执行时间,用的通知(Advice)。这个通知可以使用注解表示。5个注解表示切面的5个执行时间,这些注解叫做通知注解。@Before:前置通知@AfterRetunring:后置通知@Around:环绕... 查看详情

spring面向切面编程aop(around)实战

spring aop的环绕通知around功能强大,我们这里就不细说,直接上代码,看着注释就能明白需要的可以点击下载源码1.如果使用注解的方式则需要先创建个注解类packagecom.mb.aop;importjava.lang.annotation.*;/***常用注解说明:*1.RetentionPoli... 查看详情

springboot-aop面向切面编程

...务类,在使用的方法中调用(一般记录方式)。2、使用面向切面方式记录日志,例如针对某些业务处理方法进行日志记录。3、通过注解方式,在调用的业务方法上增加日志类注解。推荐使用第二、第三中方式,使用灵活,如果... 查看详情

javaee框架整合技术之spring02-aop面向切面编程技术(代码片段)

Spring新注解Spring5.0之后的注解称为新注解使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置注解说明@Configuration表示当前类是一个配置类,用于代替配置文件,相当于applicationContext.xml@Bean作用于... 查看详情

javaee框架整合技术之spring02-aop面向切面编程技术(代码片段)

Spring新注解Spring5.0之后的注解称为新注解使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置注解说明@Configuration表示当前类是一个配置类,用于代替配置文件,相当于applicationContext.xml@Bean作用于... 查看详情

aop面向切面编程androidstudio使用aspectj监控方法运行(定义连接点注解|定义aspect切面|定义切入点|逐个处理切入点的各个连接点)(代码片段)

文章目录一、定义JoinPoint连接点注解二、定义Aspect切面1、定义Aspect切面2、定义Aspect切面3、逐个处理切入点的各个连接点4、完整Aspect切面代码三、使用AspectJ埋点并监控方法性能一、定义JoinPoint连接点注解要监控哪些方法,首先要... 查看详情

面向切面编程aop:基于xml文件的配置

除了使用AspectJ注解声明切面,Spring也支持在bean的配置文件中声明切面,这种声明是通过aopscheme中的XML元素完成的。首先建立一个类:packagecom.sevenhu.AOPTests;importorg.aspectj.lang.JoinPoint;importorg.aspectj.lang.annotation.Before;importjava.util.Arra 查看详情

spring基础ioc(控制反转)aop(面向切面编程)log4j注解配置

学习示例代码,包含本篇介绍的Spring常用操作示例和所有所需jar文件下载地址:http://download.csdn.net/detail/daijin888888/95566971.什么是Spring,有什么作用 --Spring框架属于一个解决方案框架,可以对其他技术和框架进行整合应用。&nbs... 查看详情

面向切面编程aop基于spring的aop的配置和使用(注解方式)

她:“好期待我的生日礼物...”心中暗想:?!她的生日快到了?什么时候?一年过得这么快吗?惨了,忘记日期了...(求生欲使然)挤出一丝微笑:“好好好,早给你准备好了࿰... 查看详情

java面向切面编程总结-面向切面的本质

面向切面的本质:定义切面类并将切面类的功能织入到目标类中; 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before,@AfterReturning,@After,@AfterThrowing,@Around). https://www.cnblogs.com/oumyye/p/4480196.html ... 查看详情

spring自定义注解

Spring面向切面编程(AOP)的基本用法:基于注解的实现一简介在软件开发中,分散于应用中多出的功能被称为横切关注点(如:事务、安全、缓存等)。通常来讲,这些横切关注点从概念上是与应用的业务逻辑相分离的(但是往... 查看详情

图文并茂!!!一文搞懂springaop(面向切面编程)(代码片段)

...通知类型配置注解实现SpringAOP我们为什么要使用AOP(面向切面编程)?当我们在现实中完成实际的项目时&# 查看详情

(2021.9.25)面向切面编程简述(代码片段)

说到面向切面编程,想必大家都不会陌生。不就是AOP——AspectOrientProgramming但是说了那么久,你所理解的面向切面编程,用一句话概括到底是什么呢?目录1.什么是AOP(面向切面编程)2.AOP相关术语1.连接点(... 查看详情

面向切面编程(aop)

1.AOP的简单理解  AOP全称:AspectOrientedProgramming;  面向切面编程是通过预编译方式和运行期动态代理的方式实现程序功能的统一维护的一种技术;  面向切面编程其实是凌驾于系统之上的一种设计思想,该思想不影响原始... 查看详情

spring入门面向切面编程

...些操作如果要写在业务代码中会相当麻烦,这时就会用到面向切面编程(AOP),AOP作为一种编程思想,和OOP有着不同的侧重点,面向对象侧重于万事万物皆对象,而面向切面编程则侧重于事务的一个方面。在面向切面编程过程中... 查看详情