Spring框架5.0介绍说明
本参考指南提供有关Spring框架的详细信息。它为所有功能提供了全面的文档,以及Spring所接受的基本概念(如“依赖注入”)的背景知识。
如果您刚开始使用Spring,则可能需要通过创建基于Spring Boot的应用程序来开始使用Spring Framework 。Spring Boot提供了一种快速(和有意见的)方式来创建一个基于生产的基于Spring的应用程序。它基于Spring框架,有利于配置的约定,并且旨在尽可能快地让您运行。
您可以使用start.spring.io生成一个基本项目或遵循的一个“入门”指南类的 入门构建一个RESTful Web服务 之一。除了易于消化以外,这些指南非常重视任务,其中大多数都是基于Spring Boot的。他们还涵盖了Spring解决方案中您可能想要考虑的其他项目。
Spring Framework是一个Java平台,为开发Java应用程序提供全面的基础设施支持。Spring处理基础设施,以便您可以专注于您的应用程序。
Spring使您能够从“简单的Java对象”(POJO)构建应用程序,并将企业服务非侵入式应用于POJO。此功能适用于Java SE编程模型以及完整和部分Java EE。
作为应用程序开发人员,您可以从Spring平台中获益如何:
使Java方法在数据库事务中执行,而不必处理事务API。
使本地Java方法成为HTTP端点,而无需处理Servlet API。
使本地Java方法成为一个消息处理程序,而无需处理JMS API。
使本地Java方法成为管理操作,而无需处理JMX API。
Java应用程序 - 从受限嵌入式应用程序到n层服务器端企业应用程序运行范围的宽松术语通常由协作形成应用程序的对象组成。因此,应用程序中的对象彼此具有依赖关系。
虽然Java平台提供了丰富的应用程序开发功能,但它缺乏将基本构建块组织成一个连贯的整体的手段,将该任务留给架构师和开发人员。虽然可以使用Factory,Abstract Factory,Builder,Decorator和Service Locator这样的设计模式 来构成组成应用程序的各种类和对象实例,但这些模式只是简单地说明:给出名称的最佳实践,以及什么样的模式,应用于哪里,它解决的问题等等。模式是您必须在应用程序中实现自己的正式的最佳实践。
Spring框架反转控制(IoC)组件通过提供将不同组件组成完整工作应用程序的正式方法来解决这一问题。Spring Framework将形式化的设计模式作为可以集成到您自己的应用程序中的第一类对象进行编译。许多组织和机构以这种方式使用Spring框架来设计强大的,可维护的应用程序。
“ 问题是,控制的哪个方面是(他们)反转? ”Martin Fowler 在2004年在他的网站上提出了有关反转控制(IoC)的 问题 .Fowler建议重新命名原则,使其更加自明,并提出依赖注入。
Spring框架由组织成约20个模块的功能组成。这些模块分为Core Container,数据访问/集成,Web,AOP(面向对象编程),Instrumentation,Messaging和Test,如下图所示。
以下部分列出了每个功能的可用模块及其工件名称及其涵盖的主题。工件名称与依赖关系管理工具中使用的工件ID 相关。
所述核心容器由以下部分组成spring-core
, spring-beans
,spring-context
,spring-context-support
,和spring-expression
(弹簧表达式语言)模块。
的spring-core
和spring-beans
模块提供框架的基本零件,包括IOC和依赖注入特征。这BeanFactory
是工厂模式的复杂实施。它消除了对编程单例的需要,并允许您将依赖关系的配置和规范与实际程序逻辑分离。
所述上下文(spring-context
)模块建立由设置在固体基体上的核心和豆类模块:它是访问一个框架式的方式是类似于一个JNDI注册表对象的装置。上下文模块从Beans模块继承其功能,并增加了对国际化的支持(例如使用资源束),事件传播,资源加载以及例如Servlet容器透明地创建上下文。Context模块还支持Java EE功能,如EJB,JMX和基本远程处理。该ApplicationContext
接口是语境模块的焦点。 spring-context-support
提供了将常见第三方库集成到Spring应用程序环境中的支持,特别是用于缓存(EhCache,JCache)和调度(CommonJ,Quartz)。
该spring-expression
模块提供了强大的表达式语言,用于在运行时查询和操作对象图。它是JSP 2.1规范中规定的统一表达语言(统一EL)的扩展。该语言支持设置和获取属性值,属性分配,方法调用,访问数组,集合和索引器的内容,逻辑和算术运算符,命名变量以及从Spring的IoC容器中的名称检索对象。它还支持列表投影和选择以及通用列表聚合。
该spring-aop
模块提供了一个符合AOP联盟标准的面向方面的编程实现,允许您定义方法拦截器和切入点,以便干净地解除实现应分隔的功能的代码。使用源级元数据功能,您还可以将行为信息与.NET属性类似。
单独的spring-aspects
模块提供与AspectJ的集成。
该spring-instrument
模块提供了在某些应用服务器中使用的类检测支持和类加载器实现。该spring-instrument-tomcat
模块包含Spring的Tomcat测试代理。
Spring框架4包括spring-messaging
从关键抽象模块 Spring集成项目,例如Message
,MessageChannel
,MessageHandler
,和其他人作为基于消息的应用奠定了基础。该模块还包括一组用于将消息映射到方法的注释,类似于基于Spring MVC注释的编程模型。
所述数据访问/集成层由JDBC,ORM,OXM,JMS和交易模块。
该spring-jdbc
模块提供了一个JDBC抽象层,无需执行繁琐的JDBC编码和解析数据库供应商特定的错误代码。
该spring-tx
模块支持 针对实现特殊接口和所有POJO(普通Java对象)的类的编程和声明式事务管理。
该spring-orm
模块为流行的对象关系映射 API(包括JPA和Hibernate)提供集成层 。使用该spring-orm
模块,您可以将这些O / R映射框架与Spring提供的所有其他功能结合使用,例如前面提到的简单的声明性事务管理功能。
该spring-oxm
模块提供了一个支持Object / XML映射实现的抽象层, 如JAXB,Castor,JiBX和XStream。
该spring-jms
模块(Java消息服务)包含用于生成和消费消息的功能。从Spring Framework 4.1开始,它提供了与spring-messaging
模块的集成 。
所述网络层由的spring-web
,spring-webmvc
和spring-websocket
模块。
该spring-web
模块提供基本的面向Web的集成功能,例如多部分文件上传功能,以及使用Servlet侦听器和面向Web的应用程序上下文初始化IoC容器。它还包含一个HTTP客户端和Spring的远程支持的Web相关部分。
该spring-webmvc
模块(也称为Web-Servlet模块)包含用于Web应用程序的Spring的模型视图控制器(MVC)和REST Web Services实现。Spring的MVC框架提供了领域模型代码和Web表单之间的清晰分离,并与Spring Framework的所有其他功能集成。
该spring-test
模块支持使用JUnit或TestNG对Spring组件进行单元测试和 集成测试。它提供了Spring 的一致加载ApplicationContext
和这些上下文的缓存。它还提供可用于孤立测试代码的模拟对象。
之前描述的构建模块使Spring成为许多场景中的逻辑选择,从在资源受限设备上运行的嵌入式应用程序到使用Spring的事务管理功能和Web框架集成的全面的企业应用程序。
Spring的声明式事务管理功能 使Web应用程序完全事务性,就像使用EJB容器管理的事务一样。所有您的定制业务逻辑都可以使用简单的POJO实现,并由Spring的IoC容器进行管理。其他服务包括支持发送电子邮件和独立于Web层的验证,可让您选择执行验证规则的位置。Spring的ORM支持与JPA和Hibernate集成; 例如,当使用Hibernate时,可以继续使用现有的映射文件和标准的Hibernate SessionFactory
配置。表单控制器将Web层与域模型无缝集成,消除了ActionForms
将HTTP参数转换为域模型值的需求 或其他类。
有时情况不允许您完全切换到不同的框架。Spring框架并没有强迫你在它使用的一切; 这不是一个 全无或缺的解决方案。使用Struts,Tapestry,JSF或其他UI框架构建的现有前端可以与基于Spring的中间层集成,从而允许您使用Spring事务功能。您只需要使用一个连接您的业务逻辑,ApplicationContext
并使用它WebApplicationContext
来集成您的Web层。
当你需要通过Web服务来访问现有的代码,你可以使用Spring的 Hessian-
,Rmi-
或HttpInvokerProxyFactoryBean
类。启用对现有应用程序的远程访问并不困难。
Spring Framework还为Enterprise JavaBeans 提供了一个访问和抽象层,使您能够重用现有的POJO,并将其包装在无状态会话bean中,以用于可能需要声明式安全性的可伸缩的,故障安全的Web应用程序。
依赖关系管理和依赖注入是不同的。要将Spring的这些不错的功能带入应用程序(如依赖注入),您需要组装所有需要的库(jar文件),并在运行时,并且可能在编译时将它们存入您的类路径。这些依赖关系不是注入的虚拟组件,而是文件系统中的物理资源(通常为)。依赖关系管理的过程包括定位这些资源,存储它们并将其添加到类路径中。依赖关系可以是直接的(例如,我的应用程序依赖于Spring在运行时)或间接(例如我的应用程序取决于commons-dbcp
哪个依赖于 commons-pool
)。间接依赖关系也被称为“传递性”,它们是最难识别和管理的依赖关系。
如果要使用Spring,您需要获取构成您所需要的Spring部分的jar库的副本。为了使这更容易,Spring被打包为一组尽可能分离依赖关系的模块,例如,如果您不想编写Web应用程序,则不需要spring-web模块。要参照本指南中,我们使用速记命名约定到Spring库模块spring-*
或 spring-*.jar,
其中*
代表该模块的短名称(例如spring-core
,spring-webmvc
,spring-jms
等)。您使用的实际jar文件名通常是与版本号连接的模块名称(例如spring-core-5.0.0.RC2.jar)。
Spring Framework的每个版本都会将工件发布到以下位置:
Maven Central,它是Maven查询的默认存储库,不需要任何特殊配置。Spring的许多常见的库也可以从Maven Central获得,Spring社区的大部分使用Maven进行依赖关系管理,所以这对他们来说很方便。这里的jar的名字是形式spring-*-<version>.jar
,Maven groupId是org.springframework
。
在专门用于Spring的公共Maven存储库中。除了最终的GA版本,该存储库还承载开发快照和里程碑。jar文件名与Maven Central格式相同,因此这是一个有用的地方,可以让Spring的开发版本与在Maven Central中部署的其他库一起使用。该存储库还包含捆绑包分发zip文件,其中包含所有Spring jar,捆绑在一起以便于下载。
所以您需要决定的第一件事是如何管理您的依赖关系:我们通常建议使用自动化系统,如Maven,Gradle或Ivy,但您也可以手动下载所有的jar。
下面你将会找到Spring工件的列表。有关每个模块的更完整的描述,请参阅框架模块。
GroupId的 | 的artifactId | 描述 |
---|---|---|
org.springframework |
spring-aop |
基于代理的AOP支持 |
org.springframework |
spring-aspects |
基于AspectJ的方面 |
org.springframework |
spring-beans |
豆支持,包括Groovy |
org.springframework |
spring-context |
应用程序上下文运行时,包括调度和远程抽象 |
org.springframework |
spring-context-support |
支持类将常见的第三方库集成到Spring应用程序上下文中 |
org.springframework |
spring-core |
许多其他Spring模块使用的核心实用程序 |
org.springframework |
spring-expression |
Spring表达语言(Spel) |
org.springframework |
spring-instrument |
用于JVM自举的仪表代理 |
org.springframework |
spring-instrument-tomcat |
Tomcat的仪表代理 |
org.springframework |
spring-jdbc |
JDBC支持包,包括DataSource设置和JDBC访问支持 |
org.springframework |
spring-jms |
JMS支持包,包括发送/接收JMS消息的帮助类 |
org.springframework |
spring-messaging |
支持消息架构和协议 |
org.springframework |
spring-orm |
对象/关系映射,包括JPA和Hibernate支持 |
org.springframework |
spring-oxm |
对象/ XML映射 |
org.springframework |
spring-test |
支持单元测试和集成测试Spring组件 |
org.springframework |
spring-tx |
交易基础设施,包括DAO支持和JCA整合 |
org.springframework |
spring-web |
基础网络支持,包括Web客户端和基于Web的远程处理 |
org.springframework |
spring-webmvc |
基于HTTP的Model-View-Controller和REST端点,用于Servlet堆栈 |
org.springframework |
spring-websocket |
WebSocket和SockJS基础架构,包括STOMP消息传递支持 |
虽然Spring为大量的企业和其他外部工具提供集成和支持,但它有意将其强制性依赖性保持在绝对最小值:您不必定位和下载(甚至自动)大量的jar库,以便使用Spring用于简单的用例。对于基本的依赖注入,只有一个强制性的外部依赖关系,即日志记录(有关日志记录选项的更详细描述,请参见下文)。
接下来,我们概述了配置依赖于Spring的应用程序所需的基本步骤,首先是使用Maven,然后使用Gradle,最后使用Ivy。在任何情况下,如果有什么不清楚,请参阅依赖关系管理系统的文档,或查看一些示例代码 - Spring本身在构建时使用Gradle来管理依赖关系,而我们的示例主要使用Gradle或Maven。
如果您使用Maven进行依赖关系管理,则甚至不需要显式提供记录依赖关系。例如,要创建应用程序上下文并使用依赖注入来配置应用程序,您的Maven依赖项将如下所示:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.0.RC2</version>
<scope>runtime</scope>
</dependency>
</dependencies>
而已。注意,如果您不需要针对Spring API进行编译,那么范围可以被声明为运行时,通常情况下这是基本依赖注入用例的情况。
以上示例适用于Maven Central存储库。要使用Spring Maven存储库(例如,用于里程碑或开发人员快照),您需要在Maven配置中指定存储库位置。完整版本:
<repositories>
<repository>
<id>io.spring.repo.maven.release</id>
<url>http://repo.spring.io/release/</url>
<snapshots><enabled>false</enabled></snapshots>
</repository>
</repositories>
对于里程碑:
<repositories>
<repository>
<id>io.spring.repo.maven.milestone</id>
<url>http://repo.spring.io/milestone/</url>
<snapshots><enabled>false</enabled></snapshots>
</repository>
</repositories>
对于快照:
<repositories>
<repository>
<id>io.spring.repo.maven.snapshot</id>
<url>http://repo.spring.io/snapshot/</url>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
当使用Maven时,可能会意外混合不同版本的Spring JAR。例如,您可能会发现第三方库或另一个Spring项目会将旧的版本的依赖关系传递给旧版本。如果您忘记自己明确声明直接依赖,可能会出现各种意外问题。
为了克服这些问题,Maven支持“物料清单”(BOM)依赖的概念。您可以导入spring-framework-bom
您的dependencyManagement
部分,以确保所有弹簧依赖(直接和传递)都是相同的版本。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>5.0.0.RC2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
使用BOM的另一个好处是,您不再需要<version>
根据Spring Framework工件指定属性:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependencies>
要使用具有Gradle构建系统的Spring存储库,请在该repositories
部分中包含相应的URL :
repositories { mavenCentral() // and optionally... maven { url "http://repo.spring.io/release" } }
您可以更改repositories
从URL /release
到/milestone
或/snapshot
适当。一旦存储库被配置,你可以按照通常的Gradle方式声明依赖:
dependencies { compile("org.springframework:spring-context:5.0.0.RC2") testCompile("org.springframework:spring-test:5.0.0.RC2") }
如果您喜欢使用Ivy来管理依赖项,那么还有类似的配置选项。
要配置Ivy以指向Spring存储库,请将以下解析器添加到 ivysettings.xml
:
<resolvers>
<ibiblio name="io.spring.repo.maven.release"
m2compatible="true"
root="http://repo.spring.io/release/"/>
</resolvers>
您可以更改root
从URL /release/
到/milestone/
或/snapshot/
适当。
配置完成后,您可以按通常的方式添加依赖项。例如(in ivy.xml
):
<dependency org="org.springframework"
name="spring-core" rev="5.0.0.RC2" conf="compile->runtime"/>xx
虽然使用支持依赖关系管理的构建系统是推荐的获取Spring框架的方法,但仍然可以下载分发zip文件。
分发的拉链发布到Spring Maven Repository(这只是为了方便起见,您不需要Maven或任何其他构建系统才能下载它们)。
要下载一个分发zip打开一个Web浏览器到 http://repo.spring.io/release/org/springframework/spring,并为所需的版本选择相应的子文件夹。分发文件结束-dist.zip
,例如spring-framework- {spring-version} -RELEASE-dist.zip。发行的分发也是针对里程碑和 快照发布的。
Spring的日志记录设置已经修改为Spring 5:它仍然基于Apache Commons Logging API,也称为Jakarta Commons Logging(JCL)。但是,现在spring-core
指的是spring-jcl
模块中定制的Commons Logging桥,具有Spring特定的LogFactory
实现,它自动地连接到 Log4j 2,SLF4J或JDK自己的java.util.logging
(JUL)。该实现类似于JCL-over-SLF4J桥,但具有一系列动态检测的提供程序,类似于JBoss Logging的常见目标(如Hibernate和Undertow所支持的)。
作为一个好处,不再需要像JCL-over-SLF4J这样的外部桥接器,相应地不需要从spring-core
依赖关系手动排除标准Commons Logging jar 。相反,它只是在运行时在Spring的自动检测样式中工作:只需将Log4j 2.x或SLF4J放在您的类路径上,而不需要任何额外的桥接jar,或者依靠通过JUL(具有可自定义的JUL设置)的默认日志记录。并且很好地对齐,默认的Hibernate设置将选择相同的通用日志目标。
如果Log4j和SLF4J都存在,则Log4j API将被优选使用(因为它直接匹配JCL的签名,并且本机支持“致命”日志级别以及延迟解析的消息对象),类似于JBoss Logging的提供程序首选项。可以将Log4j配置为委派给SLF4J,否则SLF4J可能被配置为委托给Log4j:请检查其网站上的说明,了解如何在这种混合场景中达成一致的结果。
从Spring 5起,删除对外部Commons Logging网桥的任何引用,还可以从现有的
如果您遇到Spring Commons Logging实现的任何其他问题,请考虑排除 |
Log4j 2本身就是将原来的Log4j项目(1.x现在是EOL)重新进行重写。从Spring 5开始,嵌入式日志桥将在类路径上可用时自动委托给Log4j 2.x。
因此,要使用Log4j与Spring,所有你需要做的就是把Log4j的在类路径,并为其提供一个配置文件(log4j2.xml
,log4j2.properties
或其他 支持的配置格式)。对于Maven用户,所需的最小依赖是:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
</dependencies>
如果您还希望启用SLF4J委托Log4j,例如默认使用SLF4J的其他库,则还需要以下依赖关系:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.8.2</version>
</dependency>
</dependencies>
以下是log4j2.xml
登录控制台的示例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="org.springframework.beans.factory" level="DEBUG"/>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Java的简单日志门面(SLF4J)是Spring通常使用的其他库使用的流行API。它通常与Logback一起使用, 它是SLF4J API的本机实现,因此在添加到应用程序类路径时由Spring自动检测:
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.2</version>
</dependency>
</dependencies>
或者,您还可以将SLF4J配置为委托给Log4j(见上文)或JUL,特别是对于默认使用SLF4J的其他库。请注意,所有图书馆通过同一个日志门面并不重要; 这只是重要的,他们最终委托给同一个日志提供商。所以当Spring可以直接去Log4j时,其他库可能会通过Log4j的SLF4J绑定,或类似于JUL。
java.util.logging
如果类路径中没有检测到Log4j或SLF4J API,Spring将默认委派。所以没有特殊的依赖关系:只要java.util.logging
在独立的应用程序(在JDK级别使用自定义或默认的JUL设置)或应用程序服务器的日志系统(和它的系统范围的JUL设置)。
请注意,该java.logging
模块在JDK 9中默认不存在,因为它不包括在内java.base
。当使用Spring与Log4j或SLF4J时,这可以正常工作,因为在这种情况下不引用JUL API。但是,当选择使用JUL作为默认日志提供程序时,请记住激活该java.logging
模块。
Spring应用程序可以在本身提供JCL实现的容器上运行,例如IBM的WebSphere Application Server(WAS)。这不会引起问题本身,而是导致需要了解的两种不同的场景:
在“父第一”ClassLoader委托模型(WAS中的默认值)中,应用程序将始终选择Commons Logging提供的服务器版本,委托给WAS记录子系统(实际上基于JUL)。JCL的应用程序提供的变体,无论是Spring 5还是JCL-over-SLF4J桥,将随着任何本地包含的日志提供程序而被有效地忽略。
使用“父进程”委托模式(常规Servlet容器中的默认值,但WAS上的显式配置选项),将提取应用程序提供的Commons Logging变体,使您能够设置本地包含的日志提供程序,例如Log4j或Logback,在您的应用程序。在没有本地日志提供程序的情况下,Spring(如常规Commons Logging)将默认委托给JUL,有效地记录到WebSphere的日志记录子系统,如“父第一”方案。
总而言之,我们建议您将“Spring”应用程序部署在“最后一个”模式中,因为它自然允许本地提供程序以及服务器的日志子系统。
https://www.leftso.com/article/208.html