Spring AOP是怎么实现的?

AOP是什么?

Aspect Oriented Programming,面向切面编程。
如果类的继承是纵向的复用代码,那AOP就是横向地复用代码,不同接口的实现类、或者不同类的子类之间,由于没有公共的接口或者祖先,没有办法统一地复用代码,就可以使用AOP来横向地复用代码。

什么情况下需要使用Spring AOP

  • 事务
    被声明式事务注解@Transactional注解的方法
  • 过滤器
    被过滤器过滤的接口
  • 器拦截
    被拦截器拦截的接口
  • init-method
    当指定了init-method方法时
    当使用了@PostConstruct来注解初始化方法时。

Spring AOP有哪些实现方式?

  • JDK动态代理
  • CGLIB动态代理

JDK动态代理

  • 什么情况下使用JDK动态代理
    用户自定义的Spring Bean实现了用户自定义的接口IServiceA的时候,则Spring AOP是通过JDK动态代理进行实现AOP。
    假设被代理的目标类叫做Aservice,Aservice实现类接口IAservice,JDK动态代理会对Aservice进行代理
    JDK动态代理是通过运行时生成接口的子类,该子类的包名是class com.sun.proxy,而全限类名一般是class com.sun.proxy. P r o x y 2 , Proxy2, Proxy2Proxy2会继承IServiceA,然后实现IServiceA中的所有方法,并使用反射对AService类中的方法进行调用。
  • JDK动态代理是怎么运作的?
    在运行时,动态生成新的字节码文件,新的字节码文件具有被代理目标类的所有方法,并且对切点(目标方法)进行了增强。

CGLIB动态代理

用户自定义的Spring Bean,叫做Bservice,如果没有实现接口,则Spring AOP是通过CGLIB动态代理实现AOP。
CGLIB会生成一个新的类,继承Bservice,新的类一般叫做EnhanceBserviceCglib,EnhanceBserviceCglib中有增强的业务代理,且EnhanceBserviceCglib会继承Bservice,然后直接通过super.xxxMethod()的方式调用父类(被代理的目标类)的方法。

参考

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值