前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring5深入浅出篇:基于注解实现的AOP

Spring5深入浅出篇:基于注解实现的AOP

原创
作者头像
全干程序员demo
发布2024-05-06 14:59:23
1550
发布2024-05-06 14:59:23
举报
文章被收录于专栏:Spring5深入浅出篇

Spring5深入浅出篇:基于注解实现的AOP

基于注解的AOP编程的开发步骤

  1. 原始对象
  2. 额外功能
  3. 切⼊点
  4. 组装切⾯

可以发现其实1,2,3最终目的就是为了去组装切面,其实这里和我们传统开发aop的步骤是一样的

代码语言:java
复制
# 通过切⾯类 定义了 额外功能 @Around
 定义了 切⼊点 @Around("execution(* login(..))")
 @Aspect 切⾯类
 
package com.baizhiedu.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
/*
传统使用配置文件开发aop步骤
 1. 额外功能
 public class MyArround implements MethodInterceptor{
 public Object invoke(MethodInvocation invocation){
     Object ret = invocation.proceed();
     return ret;
  }
 }
 2. 切⼊点
 <aop:config
 <aop:pointcut id="" expression="execution(*login(..))"/>
 */
@Aspect
public class MyAspect {
 //这里通过注解的方式定义切入点表达式
 @Around("execution(* login(..))")
 public Object arround(ProceedingJoinPoint joinPoint) throws
Throwable {
  //增强额外方法,这里还是通过日志的形式表现
 System.out.println("----aspect log ------");
 //这里不再通过MethodInvocation的方式来代表原始方法执行,而是ProceedingJoinPoint
 Object ret = joinPoint.proceed();
 return ret;
 }
}
代码语言:xml
复制
<bean id="userService"
class="com.baizhiedu.aspect.UserServiceImpl"/>
 <!--
 切⾯
 1. 额外功能
 2. 切⼊点
 3. 组装切⾯
 -->
<bean id="arround" class="com.baizhiedu.aspect.MyAspect"/>
<!--告知Spring基于注解进⾏AOP编程-->
<aop:aspectj-autoproxy />

细节

切⼊点复⽤

首先第一个问题,为什么需要切入点复用呢?主要是为了在同一个切入点增加一个额外方法,比如我们给切入点添加了日志方法还需要添加事务相关方法时,就需要重复编码导致代码可维护性差

首先看如下代码

代码语言:java
复制
@Aspect
public class MyAspect {
 //这里通过注解的方式定义切入点表达式
 @Around("execution(* login(..))")
 public Object arround(ProceedingJoinPoint joinPoint) throws Throwable {
  //增强额外方法,这里还是通过日志的形式表现
 	System.out.println("----aspect log ------");
 //这里不再通过MethodInvocation的方式来代表原始方法执行,而是ProceedingJoinPoint
	 Object ret = joinPoint.proceed();
 	return ret;
 }
    
    //可以明显发现这里写了重复的代码,如果我们需要将login方法替换成register方法将会需要修改每一个
     @Around("execution(* login(..))")
 public Object arround1(ProceedingJoinPoint joinPoint) throws Throwable {
  //增强额外方法,这里还是通过日志的形式表现
 	System.out.println("----事务相关操作 ------");
 //这里不再通过MethodInvocation的方式来代表原始方法执行,而是ProceedingJoinPoint
	 Object ret = joinPoint.proceed();
 	return ret;
 }  
}

通过切入点注解 @Pointcut 进行优化

代码语言:java
复制
切⼊点复⽤:在切⾯类中定义⼀个函数 上⾯@Pointcut注解 通过这种⽅式,定义切
⼊点表达式,后续更加有利于切⼊点复⽤。
@Aspect
public class MyAspect {
    
 @Pointcut("execution(* login(..))")
 public void myPointcut(){}
    
 @Around(value="myPointcut()")
 public Object arround(ProceedingJoinPoint joinPoint) throws Throwable {
     System.out.println("----aspect log ------");
     Object ret = joinPoint.proceed();
     return ret;
 }
    
 @Around(value="myPointcut()")
 public Object arround1(ProceedingJoinPoint joinPoint) throws Throwable {
     System.out.println("----aspect tx ------");
     Object ret = joinPoint.proceed();
     return ret;
 }
}

动态代理的创建⽅式

代码语言:txt
复制
AOP底层实现 2种代理创建⽅式
1. JDK 通过实现接⼝ 做新的实现类⽅式 创建代理对象
2. Cglib通过继承⽗类 做新的⼦类 创建代理对象
默认情况 AOP编程 底层应⽤JDK动态代理创建⽅式
如果切换Cglib
 1. 基于注解AOP开发
 <aop:aspectj-autoproxy proxy-target-class="true" />
 2. 传统的AOP开发
 <aop:config proxy-target-class="true">
 </aop>

AOP阶段知识总结

以上便是本文的全部内容,我是全干程序员demo,每天为你带来最新好用的开发运维工具,如果你觉得用,请点赞,让更多的人了解相关工具

如果你想了解更多关于全干程序员demo,可以关注公众号-全干程序员demo,后面文章会首先同步至公众号

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring5深入浅出篇:基于注解实现的AOP
    • 基于注解的AOP编程的开发步骤
      • 细节
        • 切⼊点复⽤
        • 动态代理的创建⽅式
      • AOP阶段知识总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档