[原創]Spring教程01--Spring開始篇_Helloworld

開始以前

在寫這篇文章的時候;本身其實很猶豫;由於這個Spring的教程網上的教程也有不少。可是我的但願本身能夠在底層儘可能的詳細的總結一下;關於Spring的教程我的目標主要是底層的學習;可能這個是一個艱難的開始;期間可能有些錯誤,但願你們一同討論。php

概敘

Spring的簡介:

Spring FrameWork目前已經發布Spring5.0了;Spring框架是一個全功能棧(full-stack)的應用程序框架。html

Spring 的特色:

  • 輕量級:相較於EJB容器,Spring採用的IoC容器很是的輕量級,基礎版本的Spring框架大約只有2MB。Spring可讓開發者們僅僅使用POJO(Plain Old Java Object,相對於EJB)就可以開發出企業級的應用。這樣作的好處是,你不須要使用臃腫龐大的 EJB容器(應用服務器),你只須要輕量的servlet容器(如Tomcat)。尤爲在一些開發當中,很稀缺內存和CPU資源時,採用Spring比EJB不管是開發仍是部署應用都更節約資源。
  • 控制反轉(IOC):Spring使用控制反轉技術實現了鬆耦合。依賴被注入到對象,而不是建立或尋找依賴對象。 面向切面編程(AOP): Spring支持面向切面編程,同時把應用的業務邏輯與系統的服務分離開來。
  • MVC框架:Spring MVC是一個很是好的MVC框架,能夠替換其餘web框架諸如Struts。 集成性:Spring很是容易和其餘的流行框架一塊兒集成開發,這些框架包括:ORM框架,logging框架,JEE, Quartz,以及Struts等表現層框架。
  • 事務管理:Spring強大的事務管理功能,可以處理本地事務(一個數據庫)或是全局事務(多個數據,採用JTA)。 模塊分離:Spring框架是由模塊構成的。雖然已經有太多的包和類了,但它們都按照模塊分好類了,你只須要考慮你會用到的模塊,而不用理其餘的模塊。
  • 異常處理:因爲Java的JDBC,Hibernate等API中有不少方法拋出的是checked exception,而不少開發者並不能很好的處理異常。Spring提供了統一的API將這些checked exception的異常轉換成Spring的unchecked exception。
  • 單元測試:Spring寫出來的代碼很是容易作單元測試,能夠採用依賴注射(Dependency Injection)將測試的數據注射到程序中。

Spring的歷史

直接文章發佈已經更新到SpringFramwork5.0;若是你想看其餘版本的特性推薦《Spring歷史版本變遷和現在的生態帝國》參考博文java

  • JDK更新
    Spring Framework 5.0 原來是計劃在 Java 9 之上發行的;如今,框架的最低要求是 Java 8。
  • 核心框架修正
    基於Java 8 所引入的新特性進行了修訂:
  • 基於 Java 8 的反射加強, Spring Framework 5.0 中的方法參數能夠更加高效的進行訪問。
  • 核心的 Spring 接口如今提供基於Java 8 的默認方法構建的選擇性聲明。 用
  • @Nullable 和 @NotNull 註解來顯示代表可爲空的參數和以及返回值。這樣就夠在編譯的時候處理空值而不是在運行時拋出 NullPointerExceptions

基於日誌記錄方面:web

  • Spring Framework 5.0 帶來了 Commons Logging 橋接模塊的封裝, 它被叫作 spring-jcl 而不是標準的 Commons Logging。固然,無需任何額外的橋接,新版本也會對 Log4j 2.x, SLF4J, JUL ( java.util.logging) 進行自動檢測。
  • 核心容器更新

Spring Framework 5.0 如今支持候選組件索引做爲類路徑掃描的替代方案。該功能已經在類路徑掃描器中添加,以簡化添加候選組件標識的步驟。
能夠在 Spring 的 Jira上瞭解更多關於組件索引的相關信息spring

  • 含Kotlin在內的函數式編程

引入了對 JetBrains Kotlin 語言的支持。Kotlin 是一種支持函數式編程編程風格的面嚮對象語言。Kotlin 運行在 JVM 之上,但運行環境並不限於 JVM。數據庫

筆者對於Kotlin語言不是很熟悉;不作過多的評價。編程

  • 響應式編程模型

Spring 發行版本的一個激動人心的特性就是新的響應式堆棧 WEB 框架。這個堆棧徹底的響應式且非阻塞,適合於事件循環風格的處理,能夠進行少許線程的擴展。服務器

後續針對這個作個專題的探討;Spring WebFluxapp

  • 測試改進

Spring Framework 5.0 徹底支持 JUnit 5 Jupiter,因此可使用 JUnit 5 來編寫測試以及擴展。此外還提供了一個編程以及擴展模型,Jupiter 子項目提供了一個測試引擎來在 Spring 上運行基於 Jupiter 的測試。 另外,Spring Framework 5 還提供了在 Spring TestContext Framework 中進行並行測試的擴展。
針對響應式編程模型, spring-test 如今還引入了支持 Spring WebFlux 的 WebTestClient 集成測試的支持,相似於 MockMvc,並不須要一個運行着的服務端。使用一個模擬的請求或者響應, WebTestClient 就能夠直接綁定到 WebFlux 服務端設施框架

  • 庫支持

Spring Framework 5.0目前支持如下升級庫的版本 :

  • Spring Framework 5.0目前支持如下升級庫的版本 :
  • Jackson 2.6+
  • EhCache 2.10+ / 3.0 GA
  • Hibernate 5.0+
  • JDBC 4.0+
  • XmlUnit 2.x+
  • OkHttp 3.x+
  • Netty 4.1+
  • 停止支持

在 API 層面,Spring Framework 5.0 再也不支持如下包:

  • beans.factory.access
  • jdbc.support.nativejdbc
  • spring-aspects 模塊的 mock.staticmock
  • web.view.tiles2M.(最低要求 Tiles 3)
  • orm.hibernate3 和 orm.hibernate4.

目前 Hibernate 5 是支持的框架。

  • Portlet.
  • Velocity.
  • JasperReports.
  • XMLBeans.
  • JDO.
  • Guava.
    若是你正在使用任何上面的包,建議你將 Spring Framework 版本維持在 4.3.x。

快速開始

Spring官方其實推薦使用SpringBoot構建Spring框架程序,可是這裏重點關注Spring的框架的內容;因此這裏使用Spring框架搭建;後期有機會搭建SpringBoot的教程和資料。

開發環境

  • eclipse或者IDEA
  • JDK8(推薦)/7
  • Spring Framwork5

開始

  1. 構建Maven的工程;工程目錄以下:

  2. 使用註解方式的Helloworld:

pom.xml文件:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
</dependencies>
複製代碼

hello/MessageService.java

package hello.annotation;

public interface MessageService {
    String getMessage();
}
複製代碼

hello/MessagePrinter.java

package hello.annotation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MessagePrinter {

    final private MessageService service;

    @Autowired
    public MessagePrinter(MessageService service) {
        this.service = service;
    }

    public void printMessage() {
        System.out.println(this.service.getMessage());
    }
}
複製代碼

hello/Application.java

package hello.annotation;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.*;

@Configuration
@ComponentScan
public class Application {

    @Bean
    MessageService mockMessageService() {
        return new MessageService() {
            public String getMessage() {
              return "Hello World!";
            }
        };
    }

  public static void main(String[] args) {
      ApplicationContext context = 
          new AnnotationConfigApplicationContext(Application.class);
      MessagePrinter printer = context.getBean(MessagePrinter.class);
      printer.printMessage();
  }
}
複製代碼
  1. 使用xml文件配置: applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="MessageService" class="hello.xml.MessageService">
       <property name="message" value="Hello World!"/>
   </bean>
</beans>
複製代碼

MessageService.java

package hello.xml;

public class MessageService {
	private String message;

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

}
複製代碼

Application.java

package hello.xml;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Application {
	public static void main(String[] args) {
		ApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml");
		MessageService messageService = application.getBean(MessageService.class);
		System.out.println(messageService.getMessage());
	}
}

複製代碼

4.運行結果:

運行結果

簡要講解:

  1. 根據配置文件獲知配置類初始化ApplicationContet容器
  2. 根據配置注入Bean對象(MessageService)
  3. 容器實例化動態建立Bean對象 其實上述的;底層使用工廠的建立模式;Spring容器統一建立管理Java的Bean對象;關於這個具體的分析後續具體講解。

參考資料:

相關文章
相關標籤/搜索