Spring AOP的理解

 1.aop概念

         AOP一般称为面向切面编程,一般用于那些与业务逻辑无关,但却对多个对象产生影响的公共行为或者逻辑,提取出这些逻辑或者行为进行封装,封装后的可以称为"切面",切面可以减少系统的重复代码,降低模块间的耦合度,提高系统的可维护性,一般用于权限认证,日志,事务处理等.

       AOP实现对核心逻辑就是代理,可以分为动态代理和静态代理,静态代理比较经典的是AspectJ;动态代理则是Spring AOP.

2.AspectJ AOP

       AspectJ是通过静态代理对目标对象的增强,其实AspectJ的AOP逻辑就是在编译阶段生成代理类,再编译阶段将切面植入到java字节码中,运行时的对象就是增强后的AOP对象.

3.Spring AOP

      Spring AOP使用的是动态代理,动态代理是不会修改字节码的,而是再运行时再内存中临时为目标对象生成一个增强的AOP对象,再切点处做了增强,然后回调原对象的方法.从而时间增强.

      Spring AOP中的动态代理又分为两种:JDK动态代理和cglib动态代理

  1. 地球人都知道JDK动态代理只能基于接口,因为JAVA是单继承,JDK动态代理的核心类是InvocationHandler接口 和Proxy类,InvocationHandler通过invoke()方法反射调用目标类的代码,动态的将切面逻辑与目标类的业务逻辑编织再一起,然后Proxy利用InvocationHandler动态的创建一个实例,这个实例就是目标类的代理对象$Proxy对象.
  2. 如果代理类没有实现invocationHandler接口,那么Spring AOP会使用CGLIB来实现动态代理,由于cglib是一个代码生成的类库,可以在运行时动态的生成目标类的子类,所以cglib是通过继承类实现动态代理的,通过生成的子类对象重写父类方法时加入增强逻辑实现AOP,cglib是通过继承实现的动态代理,所以目标类若为final标记,是无法实现动态代理的.

4.不同点

      静态代理和动态代理区别在于生成AOP代理对象的实际不同,AspectJ的静态代理是再编译器操作字节码实现,相对来说具有更好的性能,但是AspectJ需要特定的编译器处理,而Spring AOP不需要指定编译器.

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值