spring架构图
Spring Framework 的功能被组织成了 20 来个模块。这些模块分成 Core Container, Data Access/Integration, Web, AOP
(Aspect Oriented Programming), Instrumentation, Messaging, 和 Test,
这些模块依据其所属的功能可以划分为6类不同的功能,如下图
核心容器
1、Core模块:封装了框架依赖的最底层部分,包括资源访问、类型转换及一些常用工具类。
2、Beans模块:提供了框架的基础部分,包括反转控制和依赖注入。其中Bean
Factory是容器核心,本质是“工厂设计模式”的实现,而且无需编程实现“单例设计模式”,单例完全由容器控制,而且提倡面向接口编程,而非面向实现编程;所有应用程序对象及对象间关系由框架管理,从而真正把你从程序逻辑中把维护对象之间的依赖关系提取出来,所有这些依赖关系都由BeanFactory来维护。
3、Context模块:以Core和Beans为基础,集成Beans模块功能并添加资源绑定、数据验证、国际化、Java EE支持、容器生命周期、事件传播等;核心接口是ApplicationContext。
4、EL模块:提供强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从Spring容器获取Bean,它也支持列表投影、选择和一般的列表聚合等。
这种语言支持对属性值、属性参数、方法调用、数组内容存储、收集器和索引、逻辑和算数操作及命名变量,并且通过名称从 Spring 的控制反转容器中取回对象。表达式语言模块也支持 List 的映射和选择,
AOP 及 Instrumentation
1、AOP模块:Spring AOP模块提供了符合AOP Alliance规范的面向方面的编程(aspect-oriented programming)实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中;这样各专其职,降低业务逻辑和通用功能的耦合。
2、Aspects模块:提供了对AspectJ的集成,AspectJ提供了比Spring ASP更强大的功能。
3、spring-instrument 模块提供了类 instrumentation 的支持和在某些应用程序服务器使用类加载器实现。spring-instrumenttomcat用于 Tomcat Instrumentation 代理。
消息
Spring Framework 4 包含了 spring-messaging 模块,从 Spring 集成项目中抽象出来,比如 Message, MessageChannel,
MessageHandler 及其他用来提供基于消息的基础服务。该模块还包括一组消息映射方法的注解,类似于基于编程模型Spring MVC 的注解。
数据访问/集成
Data Access/Integration 层由 JDBC, ORM, OXM, JMS, 和 Transaction 模块组成。
1、事务模块:该模块用于Spring管理事务,只要是Spring管理对象都能得到Spring管理事务的好处,无需在代码中进行事务控制了,而且支持编程和声明性的事物管理。2、JDBC模块:提供了一个JBDC的样例模板,使用这些模板能消除传统冗长的JDBC编码还有必须的事务控制,而且能享受到Spring管理事务的好处。
3、ORM模块:提供与流行的“对象-关系”映射框架的无缝集成,包括Hibernate、JPA、Ibatiss等。而且可以使用Spring事务管理,无需额外控制事务。
4、OXM模块:提供了一个对Object/XML映射实现,将java对象映射成XML数据,或者将XML数据映射成java对象,Object/XML映射实现包括JAXB、Castor、XMLBeans和XStream。
5、JMS模块:用于JMS(Java MessagingService),提供一套“消息生产者、消息消费者”模板用于更加简单的使用JMS,JMS用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
6、Web/Remoting模块:Web/Remoting模块包含了Web、Web-Servlet、Web-Struts、Web-Porlet模块。
Web模块
Web 层由 spring-web, spring-webmvc, spring-websocket, 和 spring-webmvc-portlet 组成 。
1、spring-web:提供了基础的web功能。例如多文件上传、集成IoC容器、远程过程访问(RMI、Hessian、Burlap)以及Web Service支持,并提供一个RestTemplate类来提供方便的Restful services访问。
2、spring-webmvc :(也被称为 Web Servlet 模块)提供了一个Spring MVC Web框架实现。包含 Spring 的model-view-controller (模型-视图-控制器(MVC)和REST Web Services 实现的Web应用程序。Spring 的 MVC 框架提供了domain model(领域模型)代码和 web form (网页)之间的完全分离,并且集成了 Spring Framework 所有的其他功能。
3、spring-webmvc-portlet 模块(也被称为 Web-Portlet 模块)提供了MVC 模式的实现是用一个 Portlet 的环境和 springwebmvc模块功能的镜像。
Test模块
spring-test 模块支持通过组合 JUnit 或 TestNG 来进行单元测试和集成测试 。它提供了连续的加载 ApplicationContext 并且缓存这些上下文。它还提供了 mock object(模仿对象),您可以使用隔离测试你的代码。
使用场景
下图是个典型的应用场景:
Spring 中的组件列表
GroupId | ArtifactId | |
---|---|---|
org.springframework | spring-aop | spring-aop 模块提供 AOP Alliance-compliant(联盟兼容)的面向切面编程实现, |
org.springframework | spring-aspects | 单独的 spring-aspects 模块提供了集成使用 AspectJ。 |
org.springframework | spring-beans | 提供了框架的基础部分,包括反转控制和依赖注入。其中Bean |
org.springframework | spring-context | 模块建立且提供于在Core 和 Beans 模块的基础上,它是一种在框架类型下实现对象存储操作的手段 |
org.springframework | spring-context-support | 支持将通用第三方库集成到Spring 中 |
org.springframework | spring-core | 许多其他Spring模块使用的核心工具 |
org.springframework | spring-expression | 模块提供了一个强大的Expression Language(表达式语言)用来在运行时查询和操作对象图) |
org.springframework | spring-instrument | 模块提供了类 instrumentation 的支持和在某些应用程序服务器使用类加载器实现 |
org.springframework | spring-instrument-tomcat | spring-instrumenttomcat用于 Tomcat Instrumentation 代理 |
org.springframework | spring-jdbc | 模块提供了不需要编写冗长的JDBC代码和解析数据库厂商特有的错误代码的JDBC-抽象层。 |
org.springframework | spring-jms | )包含生产和消费信息的功能 |
org.springframework | spring-messaging | 从 Spring Framework 4.1 开始提供集成 springmessaging模块。 |
org.springframework | spring-orm | ,其包含 JPA,JDO,Hibernate。使用ORM包,你可以使用所有的 O/R 映射框架结合所有Spring 提供的特性 |
org.springframework | spring-oxm | 模块提供抽象层用于支持 Object/XML mapping (对象/XML映射)的实现,如 JAXB、Castor、XMLBeans、JiBX和 XStream 的。 |
org.springframework | spring-test | spring-test 模块支持通过组合 JUnit 或 TestNG 来进行单元测试和集成测试 |
maven的pom.xml文件如下:
<!--Spring Maven 存储库-->
<repositories>
<repository>
<id>io.spring.repo.maven.release</id>
<url>http://repo.spring.io/release/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<!--spring-framework-bom 来确保所有 spring依赖(包括直接和传递的)是同一版本。无需指定 <version> 属性-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>4.3.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc-portlet</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
</dependency>
</dependencies>
<!--mvn tomcat7:run-->
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<update>true</update>
<charset>utf-8</charset>
<uriEncoding>UTF-8</uriEncoding> <url>http://localhost:8881/manager/text</url>
<server>tomcat8</server>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
日志
在 Spring 强制性的日志依赖 是 Jakarta Commons Logging API(JCL)。
如果你使用 Maven 为例,在你想拿起依赖 commons-logging ,这
个是来自 Spring 的并且明确来自中心模块 spring-core。
不使用 Commons Logging
基本上有两种方法可以关闭commons-logging:
1. 通过 spring-core 模块排除依赖(因为它是唯一的显示依赖于 commons-logging 的模块)。
2. 依赖特殊的 commons-logging 依赖,用空的jar(更多的细节可以在SLF4J FAQ中找到)替换掉库。
排除 commons-logging,添加以下的内容dependencyManagement 部分:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency
使用 SLF4J
一个常见的选择就是桥接 Spring 和 SLF4J,提供显示的绑定 SLF4J 到Log4J 上。你需要支持 4 个的依赖(排除现有的commons-logging):桥接,SLF4J API,绑定 Log4J 和 Log4J 实现自身。在 Maven 中你可以这样做:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.1.RELEASE</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.5.8</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.8</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.8</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
</dependencies>
这似乎是一个很大的依赖性,其仅仅是为了得到一些日志文件。那就这样吧,但是它是可选的,它在关于类加载器的问题上应该比 commons-logging 表现的更加的好。
使用 Log4J
为了使 Log4j 工作在默认的 JCL 依赖下(commons-logging),所有你需要做的事就是把 Log4j 放到类路径下,为它提供配
置文件(log4j.properties 或者 log4j.xml 在类路径的根目录下)。因此对于Maven 用户这就是你的依赖声明:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
</dependencies>
下面是一个 log4j.properties 的实例,用于将日志打印到控制台:
log4j.rootCategory=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n
log4j.category.org.springframework.beans.factory=DEBUG