英文链接:http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/overview.html#overview-modules
2.Spring框架介绍
Spring 框架是一个提供复杂的基础配置的java平台用于开发java应用。Spring处理基础的配置以便你可以专注于自己的应用开发。
Spring 让你可以使用POJOs(Plain Old Java Object 纯的java对象)构建应用以及使用非入侵方式来将企业服务应用与POJOs。这个能力呗用于Java SE 编程模块以及完全或者部分的Java EE编程。
以下是你作为一个应用开发者如何从Spring 平台获得便利的例子:
创建一个java方法执行数据库事物而不需要考虑事物的API。
创建一个本地的java方法成为远程方法而不需要处理远程APIs.
创建一个本地的java方法成为管理操作,而不需要处理JMX (Java Management Extensions )的APIs.
创建一个本地的java方法进行消息处理而不需要处理JMS(Java Message Service ) APIs.
2.1 依赖注入以及控制反转
java应用--一个宽泛的单词可以从受限的嵌入式应用到n层,服务器端的企业应用-通常由多个对象一起共同的组成。所以常常一个应用中的对象都互相之间有依赖。
尽管java平台提供了丰富的应用程序开发功能,它缺少组织基础的构建块成为一个合作的整体的方法,它将这个任务留给了架构师和开发者。尽管你可以使用设计模式比如:工厂,抽象工厂模式,构造者模式,装饰者,和服务定位(Factory, Abstract Factory, Builder, Decorator, and Service Locator )来组建很多的类以及对象实例组成一个应用,这些模式仅仅只是:最佳的实践,这个模式功能描述,在哪里去应用它,它解决的问题,以及等等。模式只是形式化的最佳实践你必须自己在你的应用中进行实践。
Spring 框架的控制反转组件通过提供一个将不同的组件组合到一个完全工作的应用中以备使用的形式化方法来解决这个问题。Spring框架把形式化设计模式编码为一等对象以便你可以集成到你自己的应用中。很多的组织和机构在这种方法中使用Spring框架来创建鲁棒性,可维护的应用。
背景: “这个问题是,哪一方面的控制被反转了?”Martin Fowler 提出了这个关于控制反转的问题(IoC)在他的网站上(/*http://martinfowler.com/intro.html*/)2004年。
Fowler 支持修改这个原则的名字让他更加自解释,并且提出了依赖注入。
2.2 模块
Spring框架由大概20个模块来组成。这些模块被分组为:核心容器, 数据访问/集成,网络,AOP(面向方向的编程),仪器,消息以及测试( Core Container, Data Access/Integration, Web, AOP (Aspect Oriented Programming), Instrumentation, Messaging, and Test) 如下图所示:
下面的章节列出了每一个模块的工件特性和覆盖的主题。工件名称和工件ID在依赖管理工具(2.3.1章节)中相关联。
2.2.1 核心容器
核心容器由:spring-core
, spring-beans
, spring-context
, spring-context-support和
spring-expression
(Spring Expression Language) 模块组成。
spring-core
, spring-beans模块提供了这个框架的基础部分,包括IoC和依赖注入特性。BeanFactory是工程模式的精确实现。它消除了对程序化单例的需求并且允许你将配置和特殊的依赖从你的程序逻辑进行解耦。
Context(spring-context)模块构建在Core和Bean实例的基础上:它是一个在框架样式内获取对象的方法和JNDI注册类似。Context模块继承自Beans 模块并且添加国际化的支持(比如 资源绑定),事件传播,资源加载,上下文的透明创建比如一个Servlet容器。这个上下文模块同样支持Jave EE特性比如:EJB,JMX以及基础远程。ApplicationContext 接口是这个上下文模块的重点。Spring-context-support 提供了集成第三方包到Spring上下文应用的支持用于缓存(EhCache, Guava, JCache),邮件(JavaMail),调度(CommonJ, Quartz)和模板引擎(FreeMarker, JasperReports, Velocity).
Spring-expression 模块提供强有力的表达式语言用来在运行时查询以及组装一个对象图。它是在JSP 2.1 规格中指定的统一表达语言(unified EL) 的扩展。这个语言支持设定和获取属性值,属性比较,方法注入,访问数组,集合索引器的内容,逻辑和算数操作符,命名变量,以及通过命名在Spring IOC中来检索对象。它同样支持列表投影以及作为一个普通的列表聚合来选取。
2.2.2 AOP 以及 仪器
Spring-aop 模块提供一个AOP 兼容联盟 面向切面编程的实现允许你定义比如方法截击和切入点来清晰的解耦代码来实现那些需要分离的功能。使用代码级的原功能,你可以将行为信息合并到你的代码中,就像.Net的属性一样.
这个单独的Spring-aspects模块提供AspectJ的集成。
spring-instrument 模块提供类实现支持和类加载实现用于特定的应用服务器。
spring-instrument-tomcat 模块包含Spring对Tomcat的代理。
2.2.3 消息传送
Spring 框架4 包含一个spring-messaging 模块以及从Spring 集成项目中抽象出来的关键词,比如:消息,消息通道,消息处理器(Message
, MessageChannel
, MessageHandler
)以及其他作为一个消息的应用程序的基础。这个模块同样包括一系列注入用于映射消息到方法中,就像Spring MVC中注入的基础编程模型。
2.2.4 数据访问/集成
数据访问/集成 层包含了JDBC, ORM, OXM, JMS和事物模块。
Spring-jdbc 模块提供一个JDBC-抽象层将单调的JDBC编程以及解析数据库容器的特定错误代码去掉。
Spring-tx 模块对那些实现了特定接口的类以及所有的POJOs支持编程和声明式的事物管理。
Spring-oxm 模块对流行的对象关系映射APIs包括JPA,JDO以及Hibernate提供整合层。使用spring-oxm模块你可以使用全部的O/R-映射 框架来和其他Spring提供的特性组合在一起比如前面提到的简单的声明式事物管理特性。
spring-jms 模块(Java Message Service )包含产生和消费消息的特性。自从4,1开始,它提供一个包含spring-messaging整合的模块。
2.2.5 web
Web层包括spring-web
, spring-webmvc
, spring-websocket
, 和 spring-webmvc-portlet 模块。
spring-web 模块提供基础的面向网络的集成,比如多文件上传的功能,使用Servlet 监听器以及面向网络的应用上下文的Ioc容器的初始化。它同样包含一个Http客户端,以及网络相关的Spring远程支持。
spring-webmvc 模块(同样被知道为Web-Servlet 模块)包括Spring 的MVC以及网络应用上REST 网络服务实现。Spring MVC框架提供了域模型和web表单之间清晰的独立并且和Spring框架其他特性进行集合。
spring-webmvc-portlet 模块(别名 Web-Portlet 模块) 在Portlet环境中提供MVC实现并且镜像spring-webmvc 模块功能。
2.2.6 测试
spring-test 模块支持Spring组件中Juit或者TestNG进行单元测试和集成测试。它提供载入Spring的ApplicationContexts 以及这些上下文的缓存。它也提供模拟对象帮助你单独测试代码。
2.3 使用场景
之前描述的构建模块使Spring成为很多场景的选择,从在有限资源的嵌入式应用到完善的使用了Spring事物管理和web框架集成的企业应用。
Spring 的声明事物管理特性使web应用具有完全的事务性,就像使用EJB容器管理事物。你所有的业务逻辑可以通过简单的POJOs实现并且被Spring IoC容器管理。其他的服务包括支持发送邮件