1. AOP(面向切面的编程)
这些大概念,怎么背诵都是难以理解的,最后肯定还是code talks。用实际场景和实际的例子来理解是最好的了。
这篇文章是我搜索之后,见到比较浅显易懂的一篇(https://www.cnblogs.com/Wolfmanlq/p/6036019.html)
我们用下面的场景当做一个例子,在一个银行系统中,有取款,还有显示余额等功能,我们可以发现,取款和显示余额的业务逻辑中,都有验证用户这个共同的部分。那么一般的写法,就是在每个业务逻辑中都加入一段验证用户的if else代码。此时,如果我们要改变这部分代码的话,我们可能就需要改变所有的业务逻辑。(其实个人感觉都给封装到同一个类中,然后再去调用这个类也可以,不过当然AOP有更好的作用。)使用了AOP,我们就把这一部分逻辑提取出来,在我们实现的时候,只实现其他的部分,不需要考虑用户验证的部分。我们的程序中只需要表明,在哪里要插入一段验证用户的代码就可以。当开发结束,我们通过注入点,注入我们想要执行的方法、代码。而且是作用于很多个控制流程的。如下图:
是不是很像插入一根棍子?插入了一块板子?这个就叫做面向切面的编程。
而且因为我们并不了解验证用户部分的实现,所以这里很明显也用到了java的反射机制。
在具体应用中(Spring)中,我们也是根据xml中的配置,来进行aop的config从而决定when\where\注入what方法到我们的程序中去的。下面这篇文章给出了具体的代码,很值得一看(https://www.cnblogs.com/hongwz/p/5764917.html)
IOC
控制反转。这里要明确,控制反转不是什么技术而是一种设计思路。我们关于控制反转,需要理解的是谁控制谁?控制了什么?
为什么叫做反转?都反转了什么?
首先,谁控制谁?在非控制反转的程序中,我们在一个类内部通过new关键字来新建一个对象,这就变成了程序主动去创建了一个依赖对象。在Ioc的设计中,会有一个专门的容器来创建这些对象。也就是由Ioc容器来控制对象的创建。谁控制谁?也就是Ioc容器创建并来控制这些他创建的对象。那么控制了什么呢?控制了对外部资源的获取。
为什么是反转?传统是我们使用new主动去获取对象,现在是由容器创建,然后把这个对象注入到其他对象内部进行使用。这就实现了反转。因为有这个容器帮我们来查找并且注入对象,对象只是通过参数等形式来接受外部创建的其他对象到自己内部进行使用,这就是反转了。依赖注入其实也是相似的,不过是另外一种说法,而且很容易发现,他们都使用到了反射这个机制。