Spring是一个开源的轻量级的Java企业应用开发框架,其初衷是为了替代当时非常笨重的Java EE(当时还称为J2EE)组件技术EJB(Enterprice Java Beans),让Java EE开发更加简单灵活。
Spring最重要的两个核心功能是依赖注入(DI,Dependency Injection)和面向切面编程(AOP,Aspect Oriented Programming)。其中DI用于管理Java对象之间的依赖关系,AOP用于解耦业务代码和公共服务代码(如日志,安全,事务等)。DI和AOP能够让代码更加简单,具有良好的松耦合特性和可测试性,极大地简化开发。理解这两者是使用Spring框架的基础。
Spring框架本身具有模块化的分层架构,开发者可以根据需要使用其中的各个模块。Spring框架对Java企业应用开发中的各类通用问题都进行了良好的抽象,因此也能够把应用各个层次所涉及的特定开发框架(如MVC框架、ORM框架)方便得组合到一起。Spring是一个极其优秀的一站式的Full-Stack集成框架。
DI(Dependency injection依赖注入)
面向对象的程序通过一组对象之间相互通信来实现特定功能,这里的通信具体来说就是一个对象对另一个对象的方法调用或者属性访问。比如有一个BlogRespositry
类负责将博客内容存储到数据库,一个BlogServlet
负责解析前端的Web请求。BlogServlet
接受到新建博客的请求之后,需要调用BlogRespositry
的方法来保存博客内容。这里BlogRespositry
就是BlogServlet
的一个依赖,具体体现在BlogServlet
会包含一个BlogRespositry
类型的成员变量。
而使用依赖注入技术,则BlogRespositry
的依赖(即BlogService
类)是由外部实例化之后注入给它的。依赖注入也称为控制反转(IoC,Inversion of Controll)。当创建一个对象时,它所依赖的对象由外部传递给它,而非自己去创建所依赖的对象(向例子中这样通过new
操作)。因此,也可以说在对象如何获取它的依赖对象这件事情上,控制权反转了。这便是控制反转和依赖注入这两个名字的由来了。
DI可以让对象之间的关系更加松耦合,而且会促使你使用面向接口编程,同时也让测试更加方便。
AOP
面向切面编程(Aspect Oriented Programming,AOP)是一种关注点分离的技术,通俗的说就是有机地将各部分代码进行分离,各司其职,互不干扰。软件开发中经常提一个词,叫做“业务逻辑”或者“业务功能”,我们的代码主要就是实现某种特定的业务逻辑。但是我们往往不能专注于业务逻辑,比如我们写业务逻辑代码的同时,还要关注事务管理、缓存、日志等一系列通用功能,如果每个业务功能都要和这些通用功能混在一起,是一件非常低效和痛苦的事情。所以,为了将业务功能的关注点和通用化功能的关注点分离开来,就需要AOP技术了。通用功能的代码实现,对应的就是我们说的切面(Aspect)。
简而言之,AOP就是一种在开发时将业务相关代码和业务无关的通用功能代码有机分离,而运行时又能够整合到一起形成完整功能的一整套技术。Spring框架中一些模块本身就是基于AOP技术来实现的,例如事务处理和安全相关的模块。
Spring包含六个部分功能,这六部份实现的功能功能分别为:
- 核心容器:核心模块,提供了IoC/DI容器
- AOP:AOP的实现和AspectJ的支持
- 消息:提供对基于消息应用的支持,提供与Spring Integration的集成
- 数据访问与集成:JDBC访问的简化、事务的支持,ORM(Object Relation Mapping)框架(如JPA、Hibernate和Mybatis等)与OXM(Object XML Mapping)框架的集成
- Web:Spring MVC的实现,能集成众多模板引擎技术(如Thymeleaf、JSP与Velocity等)
- 测试:提供大量Mock对象,支持单元测试;提供Spring Context的测试支持,支持集成测试