Spring AOP使用注意点

本文探讨了Spring AOP的使用细节,包括基于接口和CGLIB的动态代理,通配符的用法,切入点执行顺序,返回值陷阱,调用栈影响,以及使用AOP的基本原则。提醒开发者勿滥用AOP,考虑设计上的替代方案,同时强调在同一点多次切入时需谨慎处理。
摘要由CSDN通过智能技术生成

Spring中的AOP面向切面编程结合IOC容器,是编程的灵活性大大提高。结合支持通配符和注解等等一系列方便切入的特性,真香!我这里分享几个需要注意的地方,以及以我的经验总结几条原则。

Spring AOP简介

Spring AOP 基于动态代理,为以下两种:

  • 基于接口,使用JDK Dynamic Proxy
  • 非接口,使用CGLIB自动生成子类实现代理

AOP作为一种编程模型,还有着很多实现。基本需要结合代码自动生成和动态编译一些手段来使用。在JAVA语言编程中,有很多字节码生成工具除了cglib,还有 JavassistASMByte Buddy等等。参见:关于字节码生成代理的性能比较

Spring AOP的很多理念使用了AspectJ的,包括切入点表达式、相关注解(比如@Aspect@Around@Pointcut)等等。AspectJ提供加载时编织(Load-Time Weaving)和编译时编织(Compile-Time Weaving),功能强大但是需要配置较多,特别是编译织入需使用AspectJ Compiler。所以Spring的AOP选择了更为简单易用的方案。

顺便提一下静态代理,手动编码实现设计模式中的代理模式。很多文章也把AspectJ在编译器生成代理类,称为静态代理。理解就是不在运行时动态生成,一次生成就运行就直接使用了。

通配符的用法

子包路径通配用法示例:

@Aspect
@Component
public DemoAdvice {
   
  
    // 所有service层方法
    @Pointcut("execution(public * cn.x.xx.demo..service..*(..))")
    public void servicePoint() {
   
    }
    
    // 所有dao层方法
    @Pointcut("execution(public * cn.x.xx.demo..dao..*(..))")
    public void daoPoint() {
   
    }
    
    // 所有被注解@LogTime的方法
 	@Pointcut("@annotation(LogTime)")
    public void LogTimePoint() {
   
    
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值