• [SpringBoot] AOP-AspectJ 切面技术


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

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

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

                               📖Docker专栏📖Reids专栏📖MQ专栏📖SpringCloud专栏     

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

    🍭AspectJ简介

    1. 它不属于spring;

    2. AspectJ是一个AOP的框架;

    3. 定义了AOP语法;

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

    🍢什么是AspectJ 

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

    🍡实现AOP的方式

    🍬原生使用切面

    添加AOP坐标

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-aopartifactId>
    4. dependency>

    创建增强类MyAOP

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

    1. @Component
    2. @Aspect
    3. public class MyAOP {
    4. //定义切点
    5. @Pointcut("execution(* com.moming.service.*.*(..))")
    6. public void point(){}
    7. @Before("point()")
    8. public void before(){
    9. System.out.println("===>前置通知");
    10. }
    11. @After("point()")
    12. public void after(){
    13. System.out.println("===>后置通知");
    14. }
    15. @Around("point()")
    16. public Object arround(ProceedingJoinPoint pjp) throws Throwable {
    17. System.out.println("===>环绕前");
    18. Object resules = pjp.proceed();
    19. System.out.println("===>环绕后");
    20. return resules;
    21. }
    22. @AfterReturning(value = "point()",returning = "ret")
    23. public void returning(JoinPoint jp, String ret){
    24. Object[] args = jp.getArgs();
    25. System.out.println("返回后通知获取参数: "+Arrays.toString(args));
    26. System.out.println("===>返回后通知,返回值: "+ret);
    27. }
    28. @AfterThrowing("point()")
    29. public void throwing(){
    30. System.out.println("===>异常通知");
    31. }
    32. }

    service/OrderService

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

    启动类测试

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

    无异常时

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

    补充配置说明

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

    🍫通过注解使用切面 

    声明注解NeedCut

    1. @Documented
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Target({ElementType.TYPE,ElementType.METHOD})
    4. public @interface NeedCut {
    5. }

    切换注解

    1. @Component
    2. @Aspect
    3. public class MyAOP {
    4. //定义切点
    5. @Pointcut("@annotation(com.moming.annotation.NeedCut)")
    6. public void point(){}
    7. @Before("point()")
    8. public void before(){
    9. System.out.println("===>前置通知");
    10. }
    11. @After("point()")
    12. public void after(){
    13. System.out.println("===>后置通知");
    14. }
    15. @Around("point()")
    16. public Object arround(ProceedingJoinPoint pjp) throws Throwable {
    17. System.out.println("===>环绕前");
    18. Object resules = pjp.proceed();
    19. System.out.println("===>环绕后");
    20. return resules;
    21. }
    22. @AfterReturning(value = "point()",returning = "ret")
    23. public void returning(JoinPoint jp, String ret){
    24. Object[] args = jp.getArgs();
    25. System.out.println("返回后通知获取参数: "+Arrays.toString(args));
    26. System.out.println("===>返回后通知,返回值: "+ret);
    27. }
    28. @AfterThrowing("point()")
    29. public void throwing(){
    30. System.out.println("===>异常通知");
    31. }
    32. }

    使用注解@NeedCut

    1. @Service
    2. public class OrderService {
    3. @NeedCut
    4. public String order(int id){
    5. System.out.println("===>目标方法:订单业务ID:"+id);
    6. return "001202210121010";
    7. }
    8. public void add(){
    9. System.out.println("===>添加订单");
    10. }
    11. }

    测试

    1. @SpringBootApplication
    2. public class App2 {
    3. public static void main(String[] args) {
    4. ConfigurableApplicationContext context = SpringApplication.run(App2.class, args);
    5. OrderService bean = context.getBean(OrderService.class);
    6. System.out.println(bean.order(01));
    7. System.out.println("-------------------");
    8. bean.add();
    9. }
    10. }

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

  • 相关阅读:
    【最佳实践】瀚高数据库安全版v4.5.8非root用户运行的安装配置
    固定式工业RFID读写器有哪些特点?如何选型?
    MySQL之进阶查询语句
    解决Tomcat中文乱码问题
    Vue集成mavon-editor实现图片上传
    ssm基于Android社区生鲜O2O订购系统设计与实现毕业设计源码231443
    Verdi实现信号的平移
    网络精通-VLAN高级配置之给予MAC地址划分VLAN
    【快应用】合众EP12车机上页面显示不全
    【天线】【3】CST一些快捷键
  • 原文地址:https://blog.csdn.net/HeyVIrBbox/article/details/127525756