1. 程式人生 > 其它 >spring——第一個spring案例

spring——第一個spring案例

Spring是什麼(理解)

Spring是分層的 Java SE/EE應用 full-stack 輕量級開源框架,以 IoC(Inverse Of Control:反轉控制)和 AOP(Aspect Oriented Programming:面向切面程式設計)為核心。

提供了展現層 SpringMVC和持久層 Spring JDBCTemplate以及業務層事務管理等眾多的企業級應用技術,還能整合開源世界眾多著名的第三方框架和類庫,逐漸成為使用最多的Java EE 企業應用開源框架

上圖中包含了 Spring 框架的所有模組,這些模組可以滿足一切企業級應用開發的需求,在開發過程中可以根據需求有選擇性地使用所需要的模組。下面分別對這些模組的作用進行簡單介紹。

 

1. Data Access/Integration(資料訪問/整合)

資料訪問/整合層包括 JDBC、ORM、OXM、JMS 和 Transactions 模組,具體介紹如下。

  • JDBC 模組:提供了一個 JBDC 的樣例模板,使用這些模板能消除傳統冗長的 JDBC 編碼還有必須的事務控制,而且能享受到 Spring 管理事務的好處。
  • ORM 模組:提供與流行的“物件-關係”對映框架無縫整合的 API,包括 JPA、JDO、Hibernate 和 MyBatis 等。而且還可以使用 Spring 事務管理,無需額外控制事務。
  • OXM 模組:提供了一個支援 Object /XML 對映的抽象層實現,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。將 Java 物件對映成 XML 資料,或者將XML 資料對映成 Java 物件。
  • JMS 模組:指 Java 訊息服務,提供一套 “訊息生產者、訊息消費者”模板用於更加簡單的使用 JMS,JMS 用於用於在兩個應用程式之間,或分散式系統中傳送訊息,進行非同步通訊。
  • Transactions 事務模組:支援程式設計和宣告式事務管理。

 

2. Web 模組

Spring 的 Web 層包括 Web、Servlet、WebSocket 和 Portlet 元件,具體介紹如下。

  • Web 模組:提供了基本的 Web 開發整合特性,例如多檔案上傳功能、使用的 Servlet 監聽器的 IOC 容器初始化以及 Web 應用上下文。
  • Servlet 模組:提供了一個 Spring MVC Web 框架實現。Spring MVC 框架提供了基於註解的請求資源注入、更簡單的資料繫結、資料驗證等及一套非常易用的 JSP 標籤,完全無縫與 Spring 其他技術協作。
  • WebSocket 模組:提供了簡單的介面,使用者只要實現響應的介面就可以快速的搭建 WebSocket Server,從而實現雙向通訊。
  • Portlet 模組:提供了在 Portlet 環境中使用 MVC 實現,類似 Web-Servlet 模組的功能。

 

3. Core Container(Spring 的核心容器)

Spring 的核心容器是其他模組建立的基礎,由 Beans 模組、Core 核心模組、Context 上下文模組和 SpEL 表示式語言模組組成,沒有這些核心容器,也不可能有 AOP、Web 等上層的功能。具體介紹如下。

  • Beans 模組:提供了框架的基礎部分,包括控制反轉和依賴注入。
  • Core 核心模組:封裝了 Spring 框架的底層部分,包括資源訪問、型別轉換及一些常用工具類。
  • Context 上下文模組:建立在 Core 和 Beans 模組的基礎之上,整合 Beans 模組功能並新增資源繫結、資料驗證、國際化、Java EE 支援、容器生命週期、事件傳播等。ApplicationContext 介面是上下文模組的焦點。
  • SpEL 模組:提供了強大的表示式語言支援,支援訪問和修改屬性值,方法呼叫,支援訪問及修改陣列、容器和索引器,命名變數,支援算數和邏輯運算,支援從 Spring 容器獲取 Bean,它也支援列表投影、選擇和一般的列表聚合等。

 

4. AOP、Aspects、Instrumentation 和 Messaging

在 Core Container 之上是 AOP、Aspects 等模組,具體介紹如下:

  • AOP 模組:提供了面向切面程式設計實現,提供比如日誌記錄、許可權控制、效能統計等通用功能和業務邏輯分離的技術,並且能動態的把這些功能新增到需要的程式碼中,這樣各司其職,降低業務邏輯和通用功能的耦合。
  • Aspects 模組:提供與 AspectJ 的整合,是一個功能強大且成熟的面向切面程式設計(AOP)框架。
  • Instrumentation 模組:提供了類工具的支援和類載入器的實現,可以在特定的應用伺服器中使用。
  • messaging 模組:Spring 4.0 以後新增了訊息(Spring-messaging)模組,該模組提供了對訊息傳遞體系結構和協議的支援。

 

5. Test 模組

Test 模組:Spring 支援 Junit 和 TestNG 測試框架,而且還額外提供了一些基於 Spring 的測試功能,比如在測試 Web 框架時,模擬 Http 請求的功能。

==========================================================================

第一個案例:

建立專案,引入依賴:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>ssw</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.5.RELEASE</version>
        </dependency>
    </dependencies>

</project>

建立一個實體類:

package org.example;

public class HelloWorld {
    private String message;

    public void setMessage(String message)
    {
        this.message = message;
    }
    public void getMessage()
    {
        System.out.println("message : " + message);
    }
}

在resource下建立bean.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
       https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="helloWorld" class="org.example.HelloWorld">
        <property name="message" value="Hello World!——china"/>
    </bean>

</beans>

注意:

我們也可以將該配置檔案命名為其它有效的名稱,但需要注意的是,該檔名必須與 MainApp.java 中讀取的配置檔名稱一致。

Beans.xml 用於給不同的 Bean 分配唯一的 ID,並給相應的 Bean 屬性賦值。例如,在以上程式碼中,我們可以在不影響其它類的情況下,給 message 變數賦值。

MainApp.java 類的程式碼如下:

package org.example;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main 
{
    public static void main(String[] args)
    {

        

        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");

        HelloWorld obj = applicationContext.getBean("helloWorld", HelloWorld.class);

        obj.getMessage();
        
    }
    
}

注意:

關於以上程式碼,需要注意以下兩點:

  • 建立 ApplicationContext 物件時使用了 ClassPathXmlApplicationContext 類,這個類用於載入 Spring 配置檔案、建立和初始化所有物件(Bean)。
  • ApplicationContext.getBean() 方法用來獲取 Bean,該方法返回值型別為 Object,通過強制型別轉換為 HelloWorld 的例項物件,呼叫其中的 getMessage() 方法。

執行結果如下: