Spring AOP
面向切面编程(AOP),简单来说就是可以把业务流程中通用的功能抽取出来,编写成功能代码,然后在业务流程执行中根据流程需要把抽取出来的功能切进去。举例:系统的日志功能,我们每写一个功能就需要记录一下日志(或者调用记录日志的公共方法),这样的话代码会很杂,很多相似的代码就会出现,费时费力还不讨好。如果我们面向切面呢?那就简单多了,我们只需要将公共的日志代码注入到需要记录日志的地方,这样一来我就只需考虑我该怎么实现某某功能,不用去考虑记录日志之类的事项。
Spring IOC
控制反转(Inversion Of Control),这是 spring 的核心,是一种设计思想。所谓IOC 就是由spring 来负责控制对象的生命周期以及它们之间的关系。举个例子:我需要租个房子,首先我要去满大街找出租的房子,然后需要知道每个出租的房子的信息(价格,地段,面积,租期等等),然后我再根据了解到的信息挨个筛选,到最后选出自己心仪的那个房子。这个过程很复杂很费事儿,从开始找到最后定下来租都需要我参与。与传统的程序开发类似,在一个对象中如果我想使用另外一个对象,我就得先得到它(new ),到最后不用了我还要销毁(Connection),这样程序的耦合度就高了。
那么我们有没有省事儿的办法呢?诶,这个时候租房中介就来了(IOC),有了它们我就省了很多事儿,我只需要告诉他们我要找哪个地段的,大概多少钱的,多大面积的....他们就会根据手里的资源进行筛选,然后告诉我哪个房子合适,我就开始租用入住,很省事儿。回到程序中,所有的类都会在Spring容器中进行登记,告诉spring你是什么,然后你又需要哪些,然后spring会在程序运行到适当时,主动把你需要的给你,然后也会把你给到需要你的东西。所有类的创建、销毁都由spring这个容器控制,就是说控制对象生命周期的不是调用它的对象,而是spring。对于某个具体对象而言,以前是它控制其它对象,现在是所有对象都由spring来控制,所以叫做控制反转。
DI
依赖注入(DI)是对IOC的另一种理解,DI 是spring IOC 在程序运行中动态的向某个对象提供它所需要的其它对象。举个例子:比如我们的ControllerA中需要一个serviceA对象,如果按传统的方法就是需要自己去new一个serviceA。但是有了spring,我们就只需告诉spring我们需要serviceA,然后spring会根据我们的需要去进行创建。而我们就不需要关心它具体是怎么创建的。我们ControllerA需要依赖serviceA才能正常运行使用,而这个serviceA是由spring注入到ControllerA中的,所以叫做依赖注入。DI的底层是通过java的反射来实现对象注入的。