为什么需要aop?

一、使用场景

(1)需求

创建一个计算器:

需求1:在程序执行期间追踪正在发生的活动

需求2:希望计算器只能进行正数的处理

(2)不用spring写一写

1

写一个接口类:

实现接口:

写一个main方法:

运行结果:

可以发现一些问题:

1.日志输出太复杂了

运算前输出日志和运算后都需要输出日志,日志的输出是大同小异的,但是我们4个函数一共写了8次syso,不能进行重用,相当冗杂。

2.日志输出写在了函数方法里

本来函数方法是很直观的,就是运算和输出,加上了无关数据处理的代码之后,核心代码占得部分就少了,维护起来就变得复杂。

除此之外,问题可以发展为:

  1. 代码混乱:越来越多的非业务需求(日志和验证等)加入后,原有的业务方法急剧膨胀,每个方法在处理核心逻辑的同时还必须兼顾其他多个关注点。
  2. 代码分散:以日志需求为例,只是为了满足这个单一需求,就不得不在多个方法里多次重复相同的日志代码。如果日志需求本身发生变化,必须修改所有的模块。

二、使用动态代理解决以上问题

代理设计模型的原理:使用一个代理将对象包装起来,然后用该代理对象取代原始对象。

任何对原始对象的调用都要通过代理,代理对象决定是否以及何时将方法调用转到原始对象上。

首先去掉所有的日志显示。

写一个动态代理类:

注意:invoke方法里千万别用proxy,会出现死循环,导致内存溢出。

为什么?因为proxy会再次调用invoke(),是一个死循环。

运行结果:

动态代理的思想是:先写好核心逻辑方法(函数和处理过程),然后把数据和其他操作(比如输出日志)交给动态代理类进行处理,这样核心代码和其他代码就能分开了。

维护的时候可以只关注核心代码,降低了耦合度。

三、为什么需要spring的动态代理?

使用动态代理,问题就解决了吗?明显还是有两个问题:

  1. 这段代码也是挺复杂的,需要理解这段代码。
  2. 对开发人员要求水平高。

所以,最终的解决办法:使用spring框架的AOP。

aop(面向切面编程)是一种新的方法论,是对传统OOP(面向对象编程)的补充。

aop的主要变成对象是切面,而切面模块化横切关注点。使用aop编程时,仍然需要定义公共功能,但可以明确的定义这个功能在哪里,以什么方式应用,并且不必修改受影响的类,这样一来横切关注点就被模块化到特殊的对象(切面)里。

aop的好处有:

  1. 每个事物逻辑位于一个位置,代码不分散,便于维护和升级。
  2. 业务模块更加简洁,只包括核心业务代码。

1

四、总结

下次详细配置一遍aop。

1 对 “spring aop基础,为什么需要aop”的想法;

发表评论

电子邮件地址不会被公开。 必填项已用*标注