剑指Offer(Spring)——AOP

AOP——面向切面编程

软件有一个重要的概念:关注点分离:不同的问题交给不同的部分去解决。

AOP是一种关注点分离的技术,写Web时需要写缓存、业务逻辑、日志、出错处理等等东西都要放在一起,为了将业务各个功能分离开切面就出现了,当业务功能代码和切面代码分开之后架构就会变得高内聚低耦合。

如果模块化之后虽然模块本身的成本降低了,但是接口的开发的成本又升高了我们为了保证业务的完整性就需要使用切面将业务去进行合并。

AOP——三种置入方式:

  1. 编译的时候置入:需要特殊的Java编译器,如AspectJ
  2. 类加载的时候置入:需要特殊的Java编译器,如AspectJ和AspectWerkz
  3. 运行的时候置入:Spring常规的时候采用的方式,基于动态代理,实现简单。

下面的简单的demo

  1. 首先用@Aspect创建一个切面,然后用@Component加入进切面
  2. 分别使用@PointCut,@Before,@AfterReturning定义针对切面要做的事情与配置
    在这里插入图片描述

接下来介绍几个AOP相关的主要名词概念:

  1. Aspect:通用功能的代码实现
  2. Target:被织入Aspect的对象
  3. Join Point:可以作为切入点的机会,所有方法都可以作为切入点
  4. PointCut:Aspect实际被应用在的Join Point,支持正则表达式
  5. Advice:类里的方法以及这个方法如何织入到目标方法的方式
  6. Weaving:AOP的实现过程

AOP的实现:JdkProxy与Cglib

具体使用哪种方式由AopProxyFactory根据AdvisedSupport对象的配置去决定。

默认的策略是如果目标类是接口就使用JDKProxy去实现,否则用Cglib。

如果不是接口默认是用Cglib,底层原理是ASM字节码框架用继承的方法动态生成目标类的代理。

从性能角度来看,ASM生成类之后的执行过程中比较高效,而反射机制在生成类过程中比较高效。

Spring中真实实现类的逻辑包含在getBean中,getBean方法返回的实际上使Proxy的实例,而Proxy实例是Spring采用的JDKProxy或者Cglib动态生成的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值