spring-aop一学就会

1. aop概念

  • AOP是 面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
  • 通俗描述:不通过修改源代码方式,在主干功能里面添加新功能。
  • aop有两种代理的情况,一种是有接口的情况,使用jdk的动态代理,没有接口的情况使用的是cglib动态代理的方式。(具体代码省略)

2. aop术语

  1. 连接点
    类里面哪些方法可以被增强,这些方法称为连接点。
  2. 切入点
    实际被真正增强的方法,称为切入点。
  3. 通知
    实际增强的逻辑部分称为通知(或者叫增强),通知的类型有以下几种:
  • 前置通知
  • 后置通知
  • 环绕通知
  • 异常通知
  • 最终通知
  1. 切面
    把通知应用到切点的过程。

3. 具体操作

Spring 框架一般都是基于 AspectJ 实现 AOP 操作 。

3.1 切入点表达式

  • 切入点表达式作用:知道对哪个类里面的哪个方法进行增强 。
  • 语法结构: execution([权限修饰符] [返回类型] [类全路径] 方法名称 )。

3.2 开启切面扫描

  • xml形式开启切面
<!-- 需要先扫描到包,(省略) -->
<!-- 开启Aspect生成代理对象--> 
<aop:aspectj-autoproxy></aop:aspectj-autoproxy> 
  • 注解形式开启切面
@Configuration 
@Component 
@EnableAspectJAutoProxy(proxyTargetClass = true) 
public class ConfigAop { 
} 

3.3 代码示例

  • 基于注解开发(推荐)
//增强的类 
@Component 
@Aspect  //生成代理对象 
public class UserProxy { 
    //前置通知 
    //@Before注解表示作为前置通知 
    @Before(value = "execution(* com.spring5.aopanno.User.add(..))") 
    public void before() { 
        System.out.println("before........."); 
    } 
    //后置通知(返回通知) 
    @AfterReturning(value = "execution(* com.spring5.aopanno.User.add(..))") 
    public void afterReturning() { 
        System.out.println("afterReturning........."); 
    } 
    //最终通知 
    @After(value = "execution(* com.spring5.aopanno.User.add(..))") 
    public void after() { 
        System.out.println("after........."); 
    } 
    //异常通知 
    @AfterThrowing(value = "execution(* com.spring5.aopanno.User.add(..))") 
    public void afterThrowing() { 
        System.out.println("afterThrowing........."); 
    } 
    //环绕通知 
    @Around(value = "execution(* com.spring5.aopanno.User.add(..))") 
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws 
Throwable { 
        System.out.println("环绕之前........."); 
        //被增强的方法执行 
        proceedingJoinPoint.proceed(); 
        System.out.println("环绕之后........."); 
    } 
} 

注:多个切面如果有顺序的话可以使用@Order(n)作用到类上来设定优先级,n值越小优先级越高。

  • 基于配置
<!--配置aop增强--> 
<aop:config> 
    <!--切入点--> 
    <aop:pointcut id="p" expression="execution(* 
com.spring5.aopxml.Book.buy(..))"/> 
    <!--配置切面--> 
    <aop:aspect ref="bookProxy"> 
        <!--增强作用在具体的方法上--> 
        <aop:before method="before" pointcut-ref="p"/> 
    </aop:aspect> 
</aop:config> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值