IOC
首先想说说IoC(Inversion of Control,控制倒转)。这是spring的核心,贯穿始终。
Spring所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。
概念:IoC (Inverse of Control,控制反转),是指类A中有一个类B的对象,本来需要开发者在类A中初始化这个对象的,现在经过配置,spring可以自动地完成类A中的类B对象的初始化。这个过程也可以被叫作DI (Depend Injection,依赖注入),因为B类对象依赖于A类,通过spring 类B变量被注入到了A类的对象中。
作用(好处):配置灵活。 IOC模式,系统中通过引入实现了IOC模式的IOC容器,即可由IOC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实 际的应用程序代码分开。其中一个特点就是通过文本的配件文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码。 因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是现实于某种接口的),只要修改XML就可以了。虽然说修改XML后不需要重新编译java代码,但XML经常与java源代码一起打包。所有想要修改XML的话,还是需要重新打包,还是免不了重新发布。就算修改java代码,重新编译这些修改后的代码,也不是太麻烦。那使用IOC模式最本质的好处是什么呢?有一种说法是,写大型程序的时候,会用到很多其他人开发的java类。当程序员甲用到程序员乙开发的java类A时,如果使用IOC,在程序员乙写好XML配置文件后,程序员甲就不需要关心类A应如果初始化的问题,直接使用即可。IOC有利于在多人开发大型程序中提高开发效率。
实现原理:java的反射机制。
AOP
概念:AOP (Aspect Oriented Programming,面向切面编程),是指通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,是对面向对象思维方式的有力补充。我的理解中,可以做个形象的类比:甲要去办一件事情1,需要经过ABCD...流程。但这时,在B步聚前,被叫去先办了另一件事情2,完成之后又回来继续完成事情1的剩余步骤。被打断先去完成另一件事情,这个可以类比为AOP。AOP通过被管理记录日志、记录函数执行时间、事务管理等与进行数据处理主干无关的功能上。
作用(好处):AOP应用到项目中的好处,能够将与业务逻辑不相关的代码(如:日志、权限等)分离出来,减小相关业务类负担,并能让一些通用需求(如:事务)得到更广泛的复用。可以动态的添加和删除在切面上的逻辑而不影响原来的执行代码。
实现原理:通过Java的动态代理来创建AOP代理。Spring 中 AOP 代理由 Spring 的 IoC 容器负责生成、管理,其依赖关系也由 IoC 容器负责管理。因此,AOP 代理可以直接使用容器中的其他 Bean 实例作为目标。