Spring是爲了構建企業應用的輕量級框架。然而,Spring是模塊化的,容許你只是使用其中的一部分,不須要引入其餘的。你能夠在任何web框架上使用IoC容器,也能夠只使用Hibernate集成代碼或JDBC抽象層。Spring框架支持聲明式事務管理、經過RMI遠程訪問、WebService和持久化數據。它還提供全功能的MVC框架,和將AOP應用到你的系統上。html
Spring設計爲非侵入式的,意味着你的邏輯代碼不依賴與框架自己。程序員
學習Spring看這個文檔就沒錯。web
注意JDK版本要求:spring
Spring是應用於Java平臺的,使用它可讓你更專一於你的代碼。數據庫
作爲一個程序員,你能夠在Spring中得到如下好處:express
一個Java應用程序,對象間每每是相互依賴的。apache
Spring框架的控制反轉(Inversion of Control)就是爲了解決這個問題的。編程
Spring大約分爲20個模塊,這些模塊分爲核心容器、數據訪問/集成、Web、AOP、Instrumentation、消息和測試,以下圖所示:api
核心容器由spring-core
、spring-beans
、spring-context
、spring-context
和spring-expression
5個模塊構成。數組
spring-core
和spring-beans
模塊爲框架提供最基本的功能,包括IoC和依賴注入。BeanFactory
是一個工廠的實現類。它能夠免除用戶手動建立單例類而且對象之間解耦。
context(spring-core
)模塊基於spring-beans
和BeanFactory
兩個模塊,容許以框架方式訪問對象,這相似於JNDI。Context模塊繼承了Beans模塊,並支持國際化、事件傳播、資源加載等。Context模塊支持Java EE特性,如EJB、JMX、遠程訪問。spring-context
接口是Contet模塊的重點。spring-context-support
提供將第三方庫集成到Spring的功能,如緩存(EhCache,JCache)和任務調度(CommonJ,Quartz)等。
spring-expression
模塊提供強有力的在運行時查詢和操做對象的語言。這種語言支持獲取和設置屬性、方法執行、獲取數組或集合中的對象、邏輯計算、命名變量,在Spring的IoC容器中得到對象。
spring-aop
模塊提供切面編程的實現。能夠自定義方法攔截和切入點。
spring-aspects
模塊提供與AspectJ的集成。
spring-instrument
模塊爲特定的服務器提供類加載服務。spring-instrument
模塊是集成了Tomcat。
Spring4提供了spring-messaging
模塊,主要類有Message
,MessageChannel
,MessageHandler
。這個模塊還包含一些映射消息到方法的註解,相似於Spring MVC基於編程模式的註解。
這一層由JDBC、ORM、OXM、JMS、和事物模塊組成。
spring-jdbc
模塊,主要爲了解決數據庫繁多的問題,應用此可不須要關注使用的數據庫。
spring-tx
模塊提供編程式或聲明式事務處理。
spring-orm
模塊提供流行的對象關係映射的APIs,包含JPA和Hibernate.
spring-oxm
模塊提供對Object/XML映射的支持,例如JAXB,Castor,JiBX和XStream。
spring-jms
模塊(Java消息服務)包含生成和消費消息的功能。在Spring4.1之後,它集成了spring-messaging
模塊。
Web層包含spring-web
、spring-webmvc
和spring-websocket
3個模塊。
spring-web
模塊提供面向Web方法的集成特性,例如多部分文件上傳、經過監聽初始化IoC容器和麪向Web的Context,還包含HTTP客戶端和對遠程的支持。
spring-webmvc
模塊(也被稱做Web-Servlet模塊)包含Spring MVC框架。
spring-websocket
模塊提供對socket的全面支持。
spring-test
模塊經過JUnit或者TestNG來對Spring的模塊進行單元測試和集成測試。它提供一致的Spring 的ApplicationContexts
和context的緩存。它還提供mock對象讓你測試你的代碼。
Spring能夠應用在大部分場景和各類企業級應用。
依賴管理和依賴注入是不一樣的東西。爲了應用好的特性(好比依賴注入)到你的程序中,你須要添加全部必須的jar包。依賴關係能夠是直接的或者是間接的(例如個人應用依賴於commons-dbcp
,而它又依賴於ApplicationContexts
)。間接依賴是傳遞的,因此很是難以管理。
爲了方便的使用Spring,Spring已經儘可能的減小依賴和進行模塊化,若是你不打算寫一個Web應用那麼就不須要引入spring-web模塊。爲了方便表明Spring的jar包,之後使用spring-*
或spring-*.jar
來代替,*
爲不一樣的模塊(例如,spring-core
,spring-webmvc
,spring-jms
),可是實際的jar包會有相應的版本信息(例如,spring-core-5.0.0.BUILD-SNAPSHOT.jar
)。
每個版本的Spring將發佈在Maven中心,格式爲spring-*-<version>.jar
,Maven的座標爲org.springframework。
因此首先你應該決定怎麼去管理你的依賴,咱們建議使用自動化管理工具例如Maven,Gradle或者Ivy,固然你也能夠下載後手動管理。
如下是Spring的全部jar包。
GroupId | ArtifactId | 描述 |
---|---|---|
org.springframework |
spring-aop |
基於代理的AOP支持 |
org.springframework |
spring-aspects |
基於AspectJ 的切面編程 |
org.springframework |
spring-beans |
Beans的支持, 包括 Groovy |
org.springframework |
spring-context |
應用程序運行時上下文,包括調度和遠程抽象 |
org.springframework |
spring-context-support |
提供第三方庫到Spring的支持 |
org.springframework |
spring-core |
核心工具類,被其餘模塊使用 |
org.springframework |
spring-expression |
Spring 表達式語言 (SpEL) |
org.springframework |
spring-instrument |
代理JVM相關的 |
org.springframework |
spring-instrument-tomcat |
Tomcat的插件 |
org.springframework |
spring-jdbc |
提供jdbc的支持,包括數據源和JDBC訪問 |
org.springframework |
spring-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 |
一個MVC框架 |
org.springframework |
spring-websocket |
WebSocket 和SockJS 的實現,包括對STOMP的支持 |
一個Maven的依賴以下:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.0.BUILD-SNAPSHOT</version> <scope>runtime</scope> </dependency> </dependencies>
若是你不須要編譯Spring APIs能夠聲明做用域爲runtime。
Maven座標查詢能夠在http://mvnrepository.com/網站查詢到。
最新穩定版爲4.3.3.RELEASE
,建議使用這個版本。
上面是用的Maven倉庫,固然也可使用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,能夠引入spring-framework-bom
到你的dependencyManagement
中,這能夠確保你的全部Spring會使用同一個版本。
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>5.0.0.BUILD-SNAPSHOT</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
那麼之後增長Spring模塊的時候就不須要再指定<version>
標籤了:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> <dependencies>
日誌是很是重要的。由於如今日誌框架特別多,因此選擇變得很困難。
在Spring中強制使用的是Jakarta Commons Logging API (JCL),在Spring中也顯示的使用了JCL。對有全部的模塊使用相同的日誌框架是很是重要的,Spring是這麼作的,讓spring-core
模塊顯示的依賴commons-logging
,而其餘模塊則是在編譯時依賴。
若是不想使用commons-logging
而想使用其餘日誌門面(例如slf4j),能夠這麼作:
spring-core
模塊中排除對commons-logging
的依賴(只有這個模塊明確依賴commons-logging
)排除指定的日誌框架以下:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.0.0.BUILD-SNAPSHOT</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
如今應用程序應該不能正常工做了,由於沒有指定一個日誌框架,下面將使用slf4j來代替。
slf4j是一個好的日誌門面框架,比commons-logging
性能要高。而且是在編譯時綁定。
下面的例子展現了使用slf4j日誌門面框架,並使用log4j具體日誌框架的例子:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.0.0.BUILD-SNAPSHOT</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>
若是你就想使用log4j,也不須要上面那麼負責的依賴,能夠簡單的使用以下例子便可:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.0.0.BUILD-SNAPSHOT</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
文檔目錄詳見:http://www.cnblogs.com/yiwangzhibujian/p/5893219.html
這是翻譯的Spring文檔的第一部分,若是看過原文應該能夠看出這個翻譯是很簡略的,尤爲是在大段文本的翻譯上,可是重點部分仍是不會省略的,我這麼作的目的是不想把時間和精力放在那些文本語言的推敲上,而是以程序員的思惟提取重點部分,就像文檔一開始的JDK版本要求,就是隨意加上的,原文沒有,可是我以爲比較重要。這樣會比較相對快一點翻譯完這個文檔,等之後有時間在慢慢作修補工做。