JAVA源代码-Spring AOP

AOP是面向切面、面向方面、面向接口的一种模切技术。

运用情景: 1. 事务管理;2.日志管理;3.安全验证

AOP底层的实现是通过JAVA的动态代理方式,当然Spring还有静态代理方式,主要是调用业务逻辑。

我们需要解释清楚何为动态代理,举例说明,在一个类的某一个方法中前后加如日志记录、权限管理和事务管理等其它业务时,被代理的类不知道其代理类,这样就可专注于业务代理了,有解耦效果。

动态代理实现方式:1 实现InvocationHandler接口。 2. 创建代理类Proxy.newInstance(动态加代理类,代理类接口使用handler)

Spring通过AopNamespaceHandler处理AOP,进入AspectJAwareAdvisorAutoProxyCreator, 这个类是AOP的核心类。待续...

 

使用CGLIB生成代理类:

CGLIB(Code Generation Library),是一个代码生成类库,它可以在运行时动态生成某个类的子类,在子类中采用方法拦截的技术拦截所有父类方法的调用并顺势织入模切逻辑。它的出现是因为JDK的动态代理只能为接口创建目标类的代码,而对于没有通过接口定义业务方法的类,就只能采用CGLIB。

注意:

  • 如果要被代理的类是个实现类,那Spring会使用JDK动态代理来完成操作(Spring默认的实现方式)
  • 如果要被代理的类不是个实现类,Spring会强制使用CGLIB来实现动态代理

当我们需要强制使用CGLIB来实现AOP的时候,需要配置spring.aop.proxy-target-class=true或使用注解@EnableAspectAutoProxy(proxyTargetClass=true)

CGLIB主要有两步:1)获取一个拦截器链(和JDK一样)。2)创建MethodInvocation,它是继承了JDK动态代理所创建的ReflectiveMethodInvocation,覆盖了ReflectiveMethodInvocation的invokeJoinpoint方法。CGLIB里面判断当目标方法是public方法时,ReflectiveMethodInvocation一直采用反射的策略执行目标方法,而CGLIB用的是this.methodProxy.invoke,也就是执行public方法时,它会比反射有一个更好的性能。但是在使用cglib的callback方法时却还是使用反射。

通过JDK1.8 到JDK12测试,JDK动态代理的效率高于CGLIB.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值