二刷能变强系列-Spring AOP

一.问题引入

当我们需要升级业务修改逻辑代码时,我们要保证升级后的业务代码需要兼容以前的处理逻辑,也就是说再保留原有的功能逻辑的基础上,进行新的业务功能开发,这个时候就需要我们去修改当前的功能方法源码,增加新的逻辑代码,然后重新运行项目,这个时候就会出现:
(1)假如我们有当前功能方法的源码,就需要阅读当前方法的源码,然后在增加自己的新的逻辑代码,并且修改后,需要将新的类文件替换旧的类文件,本身阅读代码效率较低。
(2)假如我们没有源码,那就无法直接修改源码,哪还怎么升级?

二.解决方法

方案一:

我们有一个A对象,A中有个test()方法,我们需要对A的test方法进行升级,此时我们就去阅读A的test()方法,然后对A的test()进行逻辑修改。

在这里插入图片描述

方案二:

同样 我们需要对A中的test()进行升级,我们不直接对test()进行修改,我们可以另外建一个B类,然后对B实现A的接口,这时再对B进行升级,这这样我们就可以在不改变A的基础上对A进行升级了。然后我们就可以调B的test()使用升级后的方法了。等等,B的test(),A的test(),详细看完我上一篇的IOC的朋友应该能想到些什么吧!这个时候我们是不是要把A替换成B,我们是不是可以使用Spring的ioc帮我实现,这样我们连只需要完成我们B类就可以了。然后去applicationContext去getBean就可以了。这样就变成了下面这图

在这里插入图片描述

三.Spring AOP

其实我们使用了方案二已经是对代码升级完成的差不多了,为什么我们的主角AOP还没登场呢?

在这里就不得不提下OOP和AOP的区别了,我的理解很简单,OOP就是至上而下的扩展,AOP就是横向扩展,这么说你们可能不理解,画个图给你们你们就明白了
在这里插入图片描述
可能有些人会说我把AOP拉直不就是OOP了吗?我只能说,杠精,求放过。
好的。我们不理杠精,继续。我们Spring使用AOP是怎么一回事呢?为什么说SpringAOP强大呢?

给你们介绍几个专业点的概念,面试显得牛头啤酒点。

  • 真实对象:要进行功能扩展的对象,相当于A对象
  • 代理对象:完成功能扩展的对象相当于B对象
  • 切点:要进行功能扩展的方法相当于testA0方法
  • 前置通知方法:在切点之前执行的扩展方法
  • 后置通知方法:在切点之后执行的扩展方法
  • 切面:由前置通知+切点+后置通知形成的横向执行的面

Spring AOP可以帮我们半自动的装配升级代码,就是我们可以通过写好before(),after(),然后告诉spring怎么去组装,然后spring就会自动把升级好代理对象返回给我们了。听起来好像很猛的样子,但到底是怎么回事了,来给你画个图。
在这里插入图片描述
我们可以通过applicationContext告诉bean帮我组装好B然后交给spring容器,这样我们调A的时候通过IOC就可以调用到升级后的B的test()了。这里要说一下,AOP不用我们自己编写B类,他是使用动态代理,将生成好的B替换掉原来的A了,所以AOP的基础是IOC。

<bean id="a" class="com.wq.A"></bean>
<bean id="before" class="com.wq.E"></bean>
<bean id="after" class="com.wq.F"></bean>
<!--织入-->
<aop:config>
		<!--切点-->
      	<aop:pointcut id="test" expression="com.wq.A.test()"/>
      	<!--前置通知-->
      	<aop:before pointcut-ref="before" method="before"/>
      	<!--后置通知-->
      	<aop:after pointcut-ref="after" method="after"/> 
</aop:config>

四.结束

以前一开始学的时候,AOP,AOP就知道是用来做横向日志,根本就不知道是什么东西。果然二刷能变强,AOP其实主要就是用来代码升级的,只是他区别于我们常用的OOP,至上而下的编程,可以用横向扩展的方式来对代码进行升级维护。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值