前言java
面向切面编程(思想)AOP Aspect Oriented Programming,是面向对象基础上 更关注最终目标 而不关注中间的小目标,简而言之,就是咱们的目标(例如constroller)触发了咱们关注的方法,此时就执行咱们的观察者行为,例如在目标的方法触发前作事,触发后作事等等。spring
为了让你们更好的理解,这里把面向过程、面向对象先讲解一遍。编程
面向过程编程(思想)POP学习
Procedure Oriented Programming,面向过程编程思想(关注事情步骤,事情自己),将一件事情的总体看做是一个流程,咱们更关注事情的流程、步骤。好比我去超市买菜,我要下楼,等红绿灯,走过几条街道,进入超市选择本身要的菜,而后排队买单。我会关注这些过程要经历的事件,步骤。this
面向对象编程(思想)OOPspa
Object Oriented Programming,面向对象编程思想(关注中间有几个对象参与其中),将原有总体事情的步骤,拆分红小段,每个小段封装成一个单独的事情(方法),不一样的方法交给不一样的人来作,例如我去超市买菜,我在家里出发,最终目的是在超市买菜,中间几个环节交给不一样的人(对象)来帮我作:下楼(被人背下去),打车,选菜,排队等等都有人帮我作,我只要把这些顺序连起来,指挥不一样的对象按照我要求的顺序执行即可。代理
面向切面编程(思想)AOPcode
Aspect Oriented Programming,面向切面编程思想(面向对象基础上 更关注最终目标 而不关注中间的小目标),但要注意切面自己也是对象,好比我去超市买菜,我为起始对象,超市为目标对象,在我到超市以前所经历的事情都概括到切面对象(下楼,打车,选菜,排队执行这些方法的人(对象)等等),链接点(管理切面对象中的方法按顺序执行),代理对象负责管理这些切面对象,切点为买菜(即在目标对象中触发咱们关心的方法);xml
案例对象
这里就用js模拟了,js模拟简单些,java模拟的话思路也是同样的,并且java的spring自己用xml或注解就能够了,这里主要讲思想
// 面向切面的方式 class agency{//能够理解为过滤器 before(){ console.log("走路去超市"); } main(Func){//代理对象 this.before(); Func(); this.after(); } after(){ console.log("走路回家"); } } let agencyObj = new agency();//找代理,相似找人帮咱们买菜送上门,这方式好处在于其余人还能够找代理买家具,买学习用品等等,咱们生成了一次代理,而后传不一样的任务进去让代理帮咱们执行 function main(){ money -= 55; console.log("买完菜,减去55元,还剩:"+money); } agencyObj.main(main);//结果同上 money = 100; function main2(){ money -= 98; console.log("买日用品,减去98元,还剩:"+money); } agencyObj.main(main2);
上面的before和after方法能够当成过滤器,好比我要获得的数据渲染前先解密,解密渲染后,部分数据用*替换这类场景。
思路
面向切面的方式就是更注重结果而不注重中间实现的步骤,中间不管由多少个切面对象帮你作了事,都由一个代理对象来帮你管理执行,而咱们须要作的就是把要作的事告诉代理对象。固然面向切面的方式是否使用要根据业务场景来定,若是发现有多个方法中间须要执行的步骤流程一致,而这些方法只须要拿到通过这些步骤以后所获得的结果,不关心中间发生了什么,就使用面向切面的方式。