Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括IOC (InversionOfControl,控制反转)、DI(DependiceInjection,依赖注入) 和 AOP(Aspect Oriented Programming,面向切面编程)。
是什么?Spring是一个轻量级DI/IOC/AOP开源框架
哪里用?我觉得它可以适用于任何Java开发的程序
用之后?最直观的体现,简化Java代码开发
独自旅行 分割线
IOC(Inverse Of Controller,意为控制反转)
控制反转,实现理论为借助于“第三方”实现具有依赖关系的对象之间的解耦:即把各个对象类封装之后,通过IOC容器来关联这些对象类,这样对象和对象之间就通过IOC容器进行联系,但对象与对象之间并没有什么直接联系。
为什么叫控制反转呢?
举例说我们没有使用spring框架的时候,假设有两个对象,对象A依赖对象B,那么A对象在实例化或者运行到某一个点的时候,我们就需要主动创建对象B或者使用已经创建好的对象B,控制权在我们自己手里。
但是如果我们使用Spring的IOC容器,对象A和对象B在IOC容器中就失去了直接联系,当对象A实例化和运行时,如果需要对象B的话,IOC容器会主动创建一个对象B注入到对象A所需要的地方。这样我们就将对象A依赖于对象B的过程由主动行为变成了被动行为,就是把创建对象的权力交给了IOC容器进行管理,控制权装换到了Spring的IOC手中,这就是IOC,控制反转;
对于IOC控制反转,不光是Spring的IOC容器,我认为大部分的框架都应用到了控制反转的思想,控制反转不仅仅是创建对象的控制权,更是对执行流程的控制反转,例如我们写一个简单的MVC应用,那么我们需要具体的Controller和view,我们还需要自行控制请求的监听与接受、Controller的值以及view最后的展示的整个流程,这时候这个流程控制在我们自己手中,但是举例我们使用SpringMVC框架,使用SpringMVC之后,我们前面所提的这些流程大部分就交给了Spring来进行管理;
独自旅行 分割线
DI(Dependice Injection,依赖注入)
依赖注入:这是一种对象提供性的设计模式,如果说IOC是进行控制的,那么DI就是实现这个过程控制的方式,在介绍IOC的时候我们提到要把对象交给Spring的IOC容器进行管理,那么如何让Spring知道对象A和对象B之间的关系呢,这个关系可以称为依赖,将这个依赖通过例如XML配置文件的方式告诉框架,这就叫做依赖注入;
对于DI(依赖注入),其实也可以把它理解为一种IOC模式,我们把类与类之间的关系告诉给Spring的IOC容器,这就是把依赖告诉给框架,由框架管理,就是获得依赖对象的方式反转了;
独自旅行 分割线
AOP(Aspect Oriented Programming,面向切面编程)
面向切面编程,将日志、事务等相对独立且重复的功能进行抽取,利用spring的AOP将这些功能进行织入,提高代码的复用性;
在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。
核心业务,比如登陆,增加数据,删除数据都叫核心业务等等
周边功能,比如性能统计记录,日志,事务管理等等
面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发,然后把切面功能和核心业务功能 “编织” 在一起,这就叫AOP面向切面编程
AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
Spring AOP的原理是动态代理,动态代理意为在运行期间对业务方法进行增强,所以不会生成新类,对于动态代理技术,Spring AOP提供了对JDK动态代理的支持以及CgLib的支持。前者是基于反射技术的实现,后者是基于继承的机制实现。如果目标对象有实现接口,使用jdk代理。如果目标对象没有实现接口,则使用CgLib来进行代理操作;