栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring Aop 入门与理解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Aop 入门与理解

1.什么是AOP

OOP是面向切面编程,AOP是面向切面编程。

这两个有什么区别呢,我的理解是这样的,oop就是给我一个功能我一条路写到黑,我不管我只要实现。

aop不一样,我的理解就是不同功能就抽出来,比如日志,事务抽出来,要用的时候组装一下就可以实现你这个功能,oop就是我的逻辑里面就也会有日志啊,事务的问题。当然只有正真看到代码才能感受其中的奥妙!

1.1 AOP的优势
  1. 提高代码的重用性
  2. 业务代码的简洁
  3. 业务代码维护更高效
  4. 业务功能扩展更便捷
1.2 AOP的核心概念

1.3 入门级案例配置


      
            
            
            
            
                  
            
      

这边的Logs就是我的通知类。也就是共性方法,抽取出来了。

2. Aop 特性 2.1 切点表达式

这边大概讲一下,怎么匹配的,有个印象就行,到时候分析不出来就百度问!

 2.1.1切入点类型

这边就简单概述一下,其实就是全局切入点和局部切入点和私有切入点

为啥这边切入点要首先介绍呢,这个还是比较重要的,到时候可能存在该切入的没有匹配上,不该切入的切入了。所以正常用AOP的公司规范特别重要,什么包名,类名,方法名。乱写的话根本玩不转。 

2.2 通知类型 

下面着重介绍一下环绕通知

通知顺序的问题是看配置的顺序,配置的顺序决定着通知的顺序

2.3 通知获取切点的入参和返回值以及处理异常

这个非常重要,需要认真看

第一种获取参数的方法

 这是第二种获取的方法

 获取返回值

处理异常

3. AOP注解

这边就直接贴代码比较直观了

package com.zx.Aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyAop {
    @Pointcut("execution(* *..*(..))")
    public void Mypt(){

    }

    public void logs(){
        System.out.println("开始请求方法!日志功能");
    }
    @Before("Mypt()")
    
    public void before(JoinPoint joinPoint){
        Object[] args = joinPoint.getArgs();
        System.out.println("开始请求方法!before..."+ args[0]);
    }
    
    @Before(value = "MyPointAop.py2() && args(joinPoint)")
    public void before1(int joinPoint){
        System.out.println("开始请求方法!before1..."+ joinPoint);

    }
    @After("Mypt()")
    public void after(){
        System.out.println("开始请求方法!after");
    }
    @AfterReturning(value = "Mypt()",returning = "rets")
    public void afterReturning(Object rets){
        System.out.println("开始请求方法!afterReturning" + rets);

    }
    @AfterThrowing(value = "Mypt()",throwing = "throwable")
    public void afterThrowing(Throwable throwable){
        System.out.println("开始请求方法!afterThrowing" + throwable.getMessage());

    }
    @Around("Mypt()")
    public Object around(ProceedingJoinPoint point)  {
        System.out.println("开始请求方法!aroundBefore");
        
        Object proceed = null;
        try {
            proceed = point.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("开始请求方法!aroundAfter");
        return proceed;
    }
}

 这边贴几个注意事项

3.1 aop注解执行顺序

 3.2 注解配置方法

4.最后一个小tips
   @Around("Mypt()")
    public Object around(ProceedingJoinPoint point)  {
        //这个对象有很多有意思的数据,感兴趣的可以打印一下
        Signature signature = point.getSignature();
        System.out.println(signature.toLongString());
        System.out.println("开始请求方法!aroundBefore");
        
        Object proceed = null;
        try {
            proceed = point.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("开始请求方法!aroundAfter");
        return proceed;
    }
 

     

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/998808.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号