Spring中文文檔-第一部分


 

一、 Spring 框架概述

  Spring是為了構建企業應用的輕量級框架。然而,Spring是模塊化的,允許你只是使用其中的一部分,不需要引入其他的。你可以在任何web框架上使用IoC容器,也可以只使用Hibernate集成代碼或JDBC抽象層。Spring框架支持聲明式事務管理、通過RMI遠程訪問、WebService和持久化數據。它還提供全功能的MVC框架,和將AOP應用到你的系統上。

  Spring設計為非侵入式的,意味着你的邏輯代碼不依賴與框架本身。

1. 開始使用Spring

  學習Spring看這個文檔就沒錯。

  注意JDK版本要求:

  • JDK 6+ for Spring Framework 4.x
  • JDK 5+ for Spring Framework 3.x

2. Spring框架介紹

  Spring是應用於Java平台的,使用它可以讓你更專注於你的代碼。

  做為一個程序員,你可以在Spring中獲得以下好處:

  • 不使用事務APIs寫代碼就讓一個方法有事務處理功能
  • 不使用remote APIs就可以讓本地方法訪問遠程程序
  • 不使用JMX APIs就可以讓一個本地方法管理操作
  • 不使用JMS APIs就可以讓本地代碼處理消息

2.1 依賴注入和控制反轉(IoC)

  一個Java應用程序,對象間往往是相互依賴的。

  Spring框架的控制反轉(Inversion of Control)就是為了解決這個問題的。

2.2 各模塊

  Spring大約分為20個模塊,這些模塊分為核心容器、數據訪問/集成、Web、AOP、Instrumentation、消息和測試,如下圖所示:

2.2.1 核心容器

  核心容器由spring-corespring-beansspring-contextspring-contextspring-expression 5個模塊構成。

  spring-corespring-beans模塊為框架提供最基本的功能,包括IoC和依賴注入。BeanFactory是一個工廠的實現類。它可以免除用戶手動創建單例類並且對象之間解耦。

  context(spring-core)模塊基於spring-beansBeanFactory兩個模塊,允許以框架方式訪問對象,這類似於JNDI。Context模塊繼承了Beans模塊,並支持國際化、事件傳播、資源加載等。Context模塊支持Java EE特性,如EJB、JMX、遠程訪問。spring-context接口是Contet模塊的重點。spring-context-support提供將第三方庫集成到Spring的功能,如緩存(EhCache,JCache)和任務調度(CommonJ,Quartz)等。

  spring-expression模塊提供強有力的在運行時查詢和操作對象的語言。這種語言支持獲取和設置屬性、方法執行、獲取數組或集合中的對象、邏輯計算、命名變量,在Spring的IoC容器中獲得對象。

2.2.2 AOP 和 Instrumentation

  spring-aop模塊提供切面編程的實現。可以自定義方法攔截和切入點。

  spring-aspects模塊提供與AspectJ的集成。

  spring-instrument模塊為特定的服務器提供類加載服務。spring-instrument模塊是集成了Tomcat。

2.2.3 消息

  Spring4提供了spring-messaging模塊,主要類有MessageMessageChannelMessageHandler。這個模塊還包含一些映射消息到方法的注解,類似於Spring MVC基於編程模式的注解。

2.2.4 數據訪問/集成

  這一層由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模塊。

2.2.5 Web

  Web層包含spring-webspring-webmvcspring-websocket 3個模塊。

  spring-web模塊提供面向Web方法的集成特性,例如多部分文件上傳、通過監聽初始化IoC容器和面向Web的Context,還包含HTTP客戶端和對遠程的支持。

  spring-webmvc模塊(也被稱作Web-Servlet模塊)包含Spring MVC框架。

  spring-websocket模塊提供對socket的全面支持。

2.2.6 測試

  spring-test模塊通過JUnit或者TestNG來對Spring的模塊進行單元測試和集成測試。它提供一致的Spring 的ApplicationContexts 和context的緩存。它還提供mock對象讓你測試你的代碼。

2.3 使用場景

  Spring可以應用在大部分場景和各種企業級應用。

2.3.1 依賴管理和命名約定

  依賴管理和依賴注入是不同的東西。為了應用好的特性(比如依賴注入)到你的程序中,你需要添加所有必須的jar包。依賴關系可以是直接的或者是間接的(例如我的應用依賴於commons-dbcp,而它又依賴於ApplicationContexts)。間接依賴是傳遞的,所以非常難以管理。

  為了方便的使用Spring,Spring已經盡量的減少依賴和進行模塊化,如果你不打算寫一個Web應用那么就不需要引入spring-web模塊。為了方便代表Spring的jar包,以后使用spring-*spring-*.jar來代替,*為不同的模塊(例如,spring-corespring-webmvcspring-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>

2.3.2 日志記錄

  日志是非常重要的。因為現在日志框架特別多,所以選擇變得很困難。

  在Spring中強制使用的是Jakarta Commons Logging API (JCL),在Spring中也顯示的使用了JCL。對有所有的模塊使用相同的日志框架是非常重要的,Spring是這么做的,讓spring-core模塊顯示的依賴commons-logging,而其他模塊則是在編譯時依賴。

2.3.2.1 不使用Commons Logging

  如果不想使用commons-logging而想使用其他日志門面(例如slf4j),可以這么做:

  1. spring-core模塊中排除對commons-logging的依賴(只有這個模塊明確依賴commons-logging
  2. 依賴一個特殊的日志門面框架

  排除指定的日志框架如下:

<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來代替。

2.3.2.2 使用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>

2.3.2.3 使用log4j

  如果你就想使用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版本要求,就是隨意加上的,原文沒有,但是我覺得比較重要。這樣會比較相對快一點翻譯完這個文檔,等以后有時間在慢慢做修補工作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM