[SpringBoot] AOP-AspectJ 切面技术
创始人
2024-03-31 14:42:39
0

 ✨✨个人主页:沫洺的主页

 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 

                           📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专栏

💖💖如果文章对你有所帮助请留下三连✨✨

🍭AspectJ简介

  1. 它不属于spring;

  2. AspectJ是一个AOP的框架;

  3. 定义了AOP语法;

  4. 有一个专门的编译器用来生成遵守Java字节编码规范的Class文件

  • Spring AOP 回顾

🍢什么是AspectJ 

  • AspectJ是使用面向切面的一个框架
  • 它扩展了Java语言(它本身也是一种语言)
  • 支持原生Java代码 有自己的编译器
  • 将代码翻译成Java字节码文件
  • 是为了方便编写AOP代码而出现的
  • 使用AOP编程的三个重点 通知 切点 织入

🍡实现AOP的方式

🍬原生使用切面

添加AOP坐标

org.springframework.bootspring-boot-starter-aop

创建增强类MyAOP

对service层下的所有类的所有方法进行增强

@Component
@Aspect
public class MyAOP {//定义切点@Pointcut("execution(* com.moming.service.*.*(..))")public void point(){}@Before("point()")public void before(){System.out.println("===>前置通知");}@After("point()")public void after(){System.out.println("===>后置通知");}@Around("point()")public Object arround(ProceedingJoinPoint pjp) throws Throwable {System.out.println("===>环绕前");Object resules = pjp.proceed();System.out.println("===>环绕后");return resules;}@AfterReturning(value = "point()",returning = "ret")public void returning(JoinPoint jp, String ret){Object[] args = jp.getArgs();System.out.println("返回后通知获取参数: "+Arrays.toString(args));System.out.println("===>返回后通知,返回值: "+ret);}@AfterThrowing("point()")public void throwing(){System.out.println("===>异常通知");}
}

service/OrderService

@Service
public class OrderService {public String order(int id){System.out.println("===>目标方法:订单业务ID:"+id);return "001202210121010";}
}

启动类测试

@SpringBootApplication
public class App2 {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(App2.class, args);OrderService bean = context.getBean(OrderService.class);System.out.println(bean.order(1));}
}

无异常时

有异常时,后续代码就不再执行了

补充配置说明

//两种占位符
//* 代表的是一个单词,b* 代表的是以b开头的单词。 例如 bds
//.. 通配符 ,代表的是0个或者多个匹配项

🍫通过注解使用切面 

声明注解NeedCut

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface NeedCut {
}

切换注解

@Component
@Aspect
public class MyAOP {//定义切点@Pointcut("@annotation(com.moming.annotation.NeedCut)")public void point(){}@Before("point()")public void before(){System.out.println("===>前置通知");}@After("point()")public void after(){System.out.println("===>后置通知");}@Around("point()")public Object arround(ProceedingJoinPoint pjp) throws Throwable {System.out.println("===>环绕前");Object resules = pjp.proceed();System.out.println("===>环绕后");return resules;}@AfterReturning(value = "point()",returning = "ret")public void returning(JoinPoint jp, String ret){Object[] args = jp.getArgs();System.out.println("返回后通知获取参数: "+Arrays.toString(args));System.out.println("===>返回后通知,返回值: "+ret);}@AfterThrowing("point()")public void throwing(){System.out.println("===>异常通知");}
}

使用注解@NeedCut

@Service
public class OrderService {@NeedCutpublic String order(int id){System.out.println("===>目标方法:订单业务ID:"+id);return "001202210121010";}public void add(){System.out.println("===>添加订单");}
}

测试

@SpringBootApplication
public class App2 {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(App2.class, args);OrderService bean = context.getBean(OrderService.class);System.out.println(bean.order(01));System.out.println("-------------------");bean.add();}
}

使用@NeedCut注解的方法才进行增强

相关内容

热门资讯

新华社快讯:韩国检方对尹锡悦、... 新华社快讯:负责调查韩国前第一夫人金建希案件的特检组29日发布最终调查结果,对包括前总统尹锡悦、金建...
巩固国家通用语言文字法律地位 本报记者 朱宁宁 我国第一部有关语言文字的专门法律——国家通用语言文字法完成首次大修。 2025年1...
甘肃“十五五”规划建议:加快构... 中共甘肃省委关于制定国民经济和社会发展第十五个五年规划的建议发布,其中提到,加快构建 房地产发展新模...
部署六大重点工作 2026年积... 来源:经济参考报 12月27日至28日在京召开的全国财政工作会议为2026年的财政工作划定了重点。会...
权威抚养权律师推荐:家理(深圳... 在抚养权纠纷中,当事人急需专业且靠谱的律师来维护自身权益。那么,资深抚养权律师哪个好,经验丰富的抚养...
四川拓宽法律援助范围 今年办理... “终于胜诉了!要是按以前的规定,我这种情况属于合同纠纷,不符合法律援助申请条件。”近日,来自自贡市的...
汽车早报|零跑汽车发布首款MP... 重庆追加汽车置换、汽车报废更新补贴 据重庆日报,重庆市商务委消息,为贯彻落实国家部委相关要求,扎实...
自贸试验区昆明片区发布一批区域... 12月26日,中国(云南)自贸试验区昆明片区举行制度创新专题新闻发布会,联合昆明综合保税区发布一批改...
原创 存... “钱存银行,50万以内绝对安全”。 这句话你一定听过,但很多人只知其一,不知其二。 2015年《存款...
美银CEO判断:特朗普关税政策... 智通财经获悉,美国银行首席执行官Brian Moynihan表示,尽管2025年的关税措施曾冲击美国...