如何理解AOP,如何使用AOP (1)

4 篇文章 0 订阅

一:什么是AOP

aop 是面向切面编程,是一种编程规范。是通过提供一种非侵入行的方式来解决软件系统中的横切关注点。横切关注点是指那些在整个应用程序中存在的功能或者需求。如 验证登录 ,时间的限制,身份验证等。

二:AOP相关流程

image.png

三:Spring的AOP相关知识点

  1. 切面(Aspect):切面是一种模块化的方案,用于横向地横跨多个类和对象实现某种功能。Spring AOP使用切面来定义横切关注点。
  2. 连接点(Joinpoint):连接点是在应用程序执行期间触发切面的点。在Spring AOP中,连接点通常表示方法的执行。
  3. 通知(Advice):通知是切面在特定连接点执行的代码。Spring AOP提供了5种类型的通知:前置通知(Before)、后置通知(After)、返回通知(After-returning)、异常通知(After-throwing)和环绕通知(Around)。
  4. 切入点(Pointcut):切入点定义了连接点的集合,其中切面应该被触发。Spring AOP定义了多种切入点表达式语言,以便开发人员可以更精确地指定切入点。
  5. 引入(Introduction):引入使切面可以将新方法或属性引入到现有的类中。Spring AOP支持引入接口和目标类的代理接口。
  6. 目标对象(Target Object):目标对象是被一个或多个切面所通知的对象。在Spring AOP中,目标对象一般是一个由容器管理的Bean。
  7. AOP代理(AOP Proxy):AOP代理是在切面和目标对象之间创建的代理对象。Spring AOP支持两种类型的代理:JDK动态代理和CGLIB代理。
  8. 织入(Weaving):织入是将切面与目标对象或代理对象连接起来的过程。Spring AOP支持编译时织入、类加载时织入和运行时织入。运行时织入是Spring AOP默认的织入方式。

Spring AOP 的相关用法

Around 环绕通知

1.创建一个Annotation

在注解上添加这两行注解
image.png
在其创建的类下 创建所需的类型,如需要确认是否开启认证,是否对tocken进行验证。
image.png

2.创建一个类

image.png
在创建的类上面添加@Aspect注解,这是提醒这个类是一个切面。
并且要加上@Component组件注解
image.png
@Pointcut() 是用于定义切入点的注解,它通常与其他切面注解(如 @Before、@After 等)一起使用。注解本身并不会执行任何方法,它只是用于定义一个可重用的切入点规则。当其他切面注解引用该切入点时,才会触发相关的切面逻辑。
@Around(value =获取@Pointcut标注的类"), ProceedingJooinPoint: 在@Around注解中指定切入点表达式,该表达式指定了需要拦截的目标方法。上面的例子中,切入点表达式为CheckAOP(),表示拦截com.studio.act.annocation.CheckAOP 包下所有类的所有方法。通过在切面中使用@Around注解,可以实现对目标方法的拦截、修改和控制,从而实现对目标方法执行过程的干预和增强。
需要注意的是,在环绕通知中一定要调用ProceedingJoinPoint.proceed()方法来继续执行连接点,否则目标方法将不会被执行。ProceedingJoinPoint.proceed()是 ProceedingJoinPoint接口中的方法, 用于是否继续执行该切入点。只有返回的是ProceedingJoinPoint.proceed(),标注该注解的方法才会被执行,否则抛出对应异常。
获取页面请求

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()

让我解释一下其中的细节:

  1. RequestContextHolder.getRequestAttributes():RequestContextHolder是Spring框架提供的一个工具类,用于访问当前线程中的请求上下文信息。getRequestAttributes()方法返回当前请求的属性对象,其中包含了请求相关的信息。
  2. (ServletRequestAttributes):getRequestAttributes()方法返回的对象可能是ServletRequestAttributes或其子类的实例。为了能够使用ServletRequestAttributes的特定方法和属性,我们将其强制类型转换为ServletRequestAttributes。
  3. .getRequest():通过调用getRequest()方法,我们可以从ServletRequestAttributes对象中获取到当前请求的HttpServletRequest对象。HttpServletRequest是Java Servlet规范中定义的接口,提供了访问HTTP请求相关信息的方法。

因此,整个代码片段的作用是在Spring应用程序中获取当前请求的HttpServletRequest对象。通过该对象,你可以获取请求的URL、参数、头部信息等,并进行相应的处理和操作。
获取对应的信息并对其进行操作。若信息不匹配则抛出异常就可以了。

切入点的通知

@Before 前置通知,在目标方法(切入点)执行之前执行。value 属性绑定通知的切入点表达式,可以关联切入点声明,也可以直接设置切入点表达式。注意:如果在此回调方法中抛出异常,则目标方法不会再执行,会继续执行后置通知 -> 异常通知。
@After 后置通知,在目标方法执行后执行的。
1.创建一个注解 CheckAOP

@Target({ElementType.METHOD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckAOP {
      //因为只是演示 所以这里不写任何东西
      //如果需要某个字段,那就如Around那样写个 然后在通知里面写个反射获取到对应的值
}

2.接着创建一个组件类,并在组件类中写入@Pointcut 获取对应切点,
写入一个前置通知注解并在其注解类里写入输出语句
写入一个后置通知注解并在其注解类里写入输出语句
image.png
3.创建对应的controller 并在其方法上添加
image.png
4.测试结果
image.png

总结:

总的来说,@Around、@Before 和 @After 在 AOP 中分别表示环绕通知、前置通知和后置通知,它们的主要区别在于执行时机和作用范围:@Around 可以在目标方法执行前后都进行增强处理,需要手动控制目标方法的执行;@Before 在目标方法执行前执行增强逻辑;@After 在目标方法执行后执行增强逻辑。根据具体的需求和场景选择适当的通知类型来实现对目标方法的增强。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值