纯理论就是耍流氓。___shanyue
----------------------------------------------------------------------------------------------------------------------------------------------------------
这是关于aop的第一篇,想主要讲aop的本质,下篇会记录aop的实现,如过滤器和拦截器,aspect的使用。好了,言归正传吧。
这部分可以先略过
AOP(技术):是一种编程思想,即面向切面编程。Aop把软件系统分为两个部分:核心关注点,横切关注点。
核心关注点:业务处理的主要流程
横切关注点:一般可共用的功能,baas中,比如日志打印的部分,权限校验的部分。
------------------------------------------------------------------------------------------------------------------------
spring框架正是因为有AOP IOC这两个特性,才能使软件之间的逻辑更加清晰,配置更灵活,当然这也是spring框架的目的(废话一句)。
AOP和IOC是一种思想。
AOP在java中是利用反射机制实现的(如果你对动态代理熟悉的,可以用动态代理理解,其实其底层也是反射机制)
以一个银行的交易系统为例
取款,转账,更改重要的信息之类的业务一般都需要验证用户的身份才能进行下一步的业务操作。那么这个验证的部分属于可以提取的公用部分,自然,你也可以在每个业务流程中验证,如果这样,那就额 嗯。。。
很明显,这两个流程有重复的身份验证部分,在没有接触aop之前,想必你们也有方法优化,可以将重复的部分封装成方法,然后调用就行。那么aop是怎么优化的?他是是将重复的功能模块提取出来,但是不用我们在流程中去加入其他任何的代码表明在取款前需要进行验证用户(以取款为例),也就是在取款和转账的流程代码中没有身份验证的步骤,到这里,我希望你们问不在业务逻辑中加入验证的功能,aop是怎么实现在进行取款和转账业务的身份验证的?
前面已经说到把公用的代码提取出来了,然后告诉spring这段代码要加到哪些地方,spring就会帮你加上去,在运行的时候,会先去执行验证部分的代码,然后在继续执行你的主业务。到这里,应该能感觉到aop的作用,我们只需要关注主流程便可,而不用在写转账业务的时候还要去考虑先校验参下数,打个log,做下用户身份校验然后浩浩荡荡的开始转账操作。
所以回到第一段内容:
核心关注点:取款,转账
横切关注点:一般可共用的功能,入参校验,身份验证
图示理解:aop本质是将无业务无关的但共用的功能提取成一个横向的切面,当然,比如不管在取款前还是转账前(执行所有的业务操作),都需要进行入参校验,日志打印,那么可以将这两个功能提取成两个切面,然后再需要的地方将切面插入。