3. Spring 的入門程式

捞月亮的小北發表於2024-06-25

1. Spring 的jar包

JAR檔案 描述
spring-aop-5.3.9.jar 這個jar 檔案包含在應用中使用Spring 的AOP 特性時所需的類
spring-aspects-5.3.9.jar 提供對AspectJ的支援,以便可以方便的將面向切面的功能整合進IDE中
spring-beans-5.3.9.jar 這個jar 檔案是所有應用都要用到的,它包含訪問配置檔案、建立和管理bean 以及進行Inversion ofControl / Dependency Injection(IoC/DI)操作相關的所有類。如果應用只需基本的IoC/DI 支援,引入spring-core.jar 及spring-beans.jar 檔案就可以了。
spring-context-5.3.9.jar 這個jar 檔案為Spring 核心提供了大量擴充套件。可以找到使用Spring ApplicationContext特性時所需的全部類,JDNI 所需的全部類,instrumentation元件以及校驗Validation 方面的相關類。
spring-context-indexer-5.3.9.jar 雖然類路徑掃描非常快,但是Spring內部存在大量的類,新增此依賴,可以透過在編譯時建立候選物件的靜態列表來提高大型應用程式的啟動效能。
spring-context-support-5.3.9.jar 用來提供Spring上下文的一些擴充套件模組,例如實現郵件服務、檢視解析、快取、定時任務排程等
spring-core-5.3.9.jar Spring 框架基本的核心工具類。Spring 其它元件要都要使用到這個包裡的類,是其它元件的基本核心,當然你也可以在自己的應用系統中使用這些工具類。
spring-expression-5.3.9.jar Spring表示式語言。
spring-instrument-5.3.9.jar Spring3.0對伺服器的代理介面。
spring-jcl-5.3.9.jar Spring的日誌模組。JCL,全稱為"Jakarta Commons Logging",也可稱為"Apache Commons Logging"。
spring-jdbc-5.3.9.jar Spring對JDBC的支援。
spring-jms-5.3.9.jar 這個jar包提供了對JMS 1.0.2/1.1的支援類。JMS是Java訊息服務。屬於JavaEE規範之一。
spring-messaging-5.3.9.jar 為整合messaging api和訊息協議提供支援
spring-orm-5.3.9.jar Spring整合ORM框架的支援,比如整合hibernate,mybatis等。
spring-oxm-5.3.9.jar 為主流O/X Mapping元件提供了統一層抽象和封裝,OXM是Object Xml Mapping。物件和XML之間的相互轉換。
spring-r2dbc-5.3.9.jar Reactive Relational Database Connectivity (關係型資料庫的響應式連線) 的縮寫。這個jar檔案是Spring對r2dbc的支援。
spring-test-5.3.9.jar 對Junit等測試框架的簡單封裝。
spring-tx-5.3.9.jar 為JDBC、Hibernate、JDO、JPA、Beans等提供的一致的宣告式和程式設計式事務管理支援。
spring-web-5.3.9.jar Spring整合MVC框架的支援,比如整合Struts等。
spring-webflux-5.3.9.jar WebFlux是 Spring5 新增的新模組,用於 web 的開發,功能和 SpringMVC 類似的,Webflux 使用當前一種比較流程響應式程式設計出現的框架。
spring-webmvc-5.3.9.jar SpringMVC框架的類庫
spring-websocket-5.3.9.jar Spring整合WebSocket框架時使用

2. 第一個Spring程式

  1. 建立Maven 專案
  2. 引入依賴
  3. 定義bean , User
  4. 在根路徑下(resources)建立 Spring的配置檔案 , 並配置相關的bean
  5. 編寫測試檔案

依賴的引入

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.11</version>
        </dependency>
        <!--Junit依賴-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
        <!--log4j2的依賴-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.19.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j2-impl</artifactId>
            <version>2.19.0</version>
        </dependency>
    </dependencies>

編寫User類

package com.north.spring6.bean;
/**
 * @Author North
 * @Date 2024/4/11
 */
public class User {
    public User() {
        System.out.println("User 的無參構造方法執行了");
    }
}

在spring配置檔案中對bean​進行配置

<?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.xsd">

    <bean id="userBean" class="com.north.spring6.bean.User"></bean>
    <bean id="nowTime" class="java.util.Date"></bean>
</beans>

編寫測試程式

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

public class Spring6Test {

    @Test
    public void testFirst(){
        // 初始化Spring容器上下文(解析beans.xml檔案,建立所有的bean物件)
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
        // 根據id獲取bean物件
        Object userBean = applicationContext.getBean("userBean");
        System.out.println(userBean);
    }
}

3. 第一個Spring 程式詳細剖析

xml 檔案

<bean id="userBean" class="com.north.spring6.bean.User"></bean>

測試程式碼

    @Test
    public void testFirstSpringCode() {
        // 1. 第一步 :獲取Spring容器物件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        // 第二步:根據bean的id從spring容器中獲取這個物件
        Object userBean = applicationContext.getBean("userBean");
        System.out.println(userBean);
    }

bean標籤的id屬性可以重複嗎

答:透過測試得出:在Spring 的配置檔案中id 是不能重名的

底層是怎麼建立物件的,是透過反射機制呼叫無引數構造方法嗎?

建立物件時確實呼叫了無參構造方法

如果提供一個有引數構造方法,不提供無引數構造方法會怎樣呢?

  • spring是透過呼叫類的無引數構造方法來建立物件的,所以要想讓spring給你建立物件,必須保證無引數構造方法是存在的。

把建立好的物件儲存到一個什麼樣的資料結構當中了呢?

image

spring配置檔案的名字必須叫做spring.xml嗎?

image

透過以上的java程式碼可以看出,這個spring配置檔名字是我們負責提供的,顯然spring配置檔案的名字是隨意的。

像這樣的beans.xml檔案可以有多個嗎?

spring的配置檔案可以有多個,在ClassPathXmlApplicationContext構造方法的引數上傳遞檔案路徑即可。這是為什麼呢?透過原始碼可以看到:

image

在配置檔案中配置的類必須是自定義的嗎,可以使用JDK中的類嗎,例如:java.util.Date?

答:在spring配置檔案中配置的bean可以任意類,只要這個類不是抽象的,並且提供了無引數構造方法。

getBean()方法呼叫時,如果指定的id不存在會怎樣?

image

image

透過測試可知 ,當指定的id不存在時 ,會報異常資訊

getBean()方法返回的型別是Object,如果訪問子類的特有屬性和方法時,還需要向下轉型,有其它辦法可以解決這個問題嗎?

image

ClassPathXmlApplicationContext 是從類路徑中載入配置檔案,如果沒有在類路徑當中,又應該如何載入配置檔案呢?

沒有在類路徑中的話,需要使用FileSystemXmlApplicationContext類進行載入配置檔案。

這種方式較少用。一般都是將配置檔案放到類路徑當中,這樣可移植性更強。

ApplicationContext的超級父介面BeanFactory。

BeanFactory是Spring容器的超級介面。ApplicationContext是BeanFactory的子介面。

image

image

4. Spring6啟用Log4j2日誌框架

第一步:引入Log4j2的依賴

<!--log4j2的依賴-->
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.19.0</version>
</dependency>
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-slf4j2-impl</artifactId>
  <version>2.19.0</version>
</dependency>

第二步:在類的根路徑下提供log4j2.xml配置檔案(檔名固定為:log4j2.xml,檔案必須放到類根路徑下。)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <loggers>
        <!--
            level指定日誌級別,從低到高的優先順序:
                ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
        -->
        <root level="DEBUG">
            <appender-ref ref="spring6log"/>
        </root>
    </loggers>

    <appenders>
        <!--輸出日誌資訊到控制檯-->
        <console name="spring6log" target="SYSTEM_OUT">
            <!--控制日誌輸出的格式-->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/>
        </console>
    </appenders>

</configuration>

第三步:使用日誌框架

Logger logger = LoggerFactory.getLogger(FirstSpringTest.class);
logger.info("我是一條日誌訊息");

相關文章