Spring的第一個程式

山丘i發表於2020-08-08

一、Spring概述

1. Spring是什麼?

Spring 的主要作用就是為程式碼“解耦”,降低程式碼間的耦合度。就是讓物件和物件(模組和模組)之間關係不是使用程式碼關聯,而是通過配置來說明。即在 Spring 中說明物件(模組)的關係

Spring 根據程式碼的功能特點,使用 IOC 降低業務物件之間耦合度。IOC 使得主業務在相互呼叫過程中,不用再自己維護關係了,即不用再自己建立要使用的物件了。而是由 Spring容器統一管理,自動“注入”,注入即賦值。 而 AOP 使得系統級服務得到了最大複用,且不用再由程式設計師手工將系統級服務“混雜”到主業務邏輯中了,而是由 Spring 容器統一完成“織入”

spring全家桶:

spring , springmvc ,spring boot , spring cloud

spring: 出現是在2002左右,解決企業開發的難度。減輕對專案模組之間的管理,類和類之間的管理, 幫助開發人員建立物件,管理物件之間的關係。
spring核心技術 ioc(控制反轉) , aop(面向切面程式設計) 。能實現模組之間,類之間的解耦合。

2. IOC控制反轉

控制反轉(IOC,Inversion of Control),是一個概念,是一種思想。指將傳統上由程式程式碼直接操控的物件呼叫權交給容器,通過容器來實現物件的裝配和管理,控制反轉就是對物件控制權的轉移,從程式程式碼本身反轉到了外部容器。

通過容器實現物件的建立,屬性賦值,依賴的管理。

IoC 是一個概念,是一種思想,其實現方式多種多樣。當前比較流行的實現方式是依賴注入

依賴:classA 類中含有 classB 的例項,在 classA 中呼叫 classB 的方法完成功能,即 classA對 classB 有依賴

IOC的實現:

依賴注入:DI(Dependency Injection),程式程式碼不做定位查詢,這些工作由容器自行完成

依賴注入 DI 是指程式執行過程中,若需要呼叫另一個物件協助時,無須在程式碼中建立被呼叫者,而是依賴於外部容器,由外部容器建立後傳遞給程式

Spring 框架使用依賴注入(DI )實現 IOC

Spring 容器是一個超級大工廠,負責建立、管理所有的 Java 物件,這些 Java 物件被稱為 Bean。Spring 容器管理著容器中 Bean 之間的依賴關係,Spring 使用“依賴注入”的方式來管理 Bean 之間的依賴關係。使用 IOC 實現物件之間的解耦和

二、Spring的第一個程式

1. 建立Maven專案

下面的直接下一步就可以了,具體的看之前寫的關於Maven的操作

建立成功的如下:

2. 加入maven依賴pom.xml

<?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>com.md</groupId>
  <artifactId>01-hello-spring</artifactId>
  <version>1.0-SNAPSHOT</version>



  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <!--單元測試-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <!--spring依賴-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>

  </dependencies>

  <build>

  </build>
</project>

3. 定義介面和實體類

package com.md.service;

/**
 * @author MD
 * @create 2020-08-07 17:32
 */
public interface SomeService {
    void doSome();
}

//-----------------------------------------
package com.md.service.impl;
import com.md.service.SomeService;
/**
 * @author MD
 * @create 2020-08-07 17:33
 */
public class SomeServiceImpl implements SomeService {


    public SomeServiceImpl() {
        System.out.println("我是SomeServiceImpl的無參構造方法");
    }

    @Override
    public void doSome() {
        System.out.println("執行了SomeServiceImpl的doSome()方法");
    }
}

4. 建立Spring的配置檔案

在src/main/resources目錄下建立xml檔案,具體如下:檔名可以隨意,但 Spring 建議的名稱為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.xsd">

    <!--
        spring的配置檔案
        1. beans:根標籤,spring把java物件成為bean
        2. spring-beans.xsd是約束檔案,和mybatis的dtd類
    -->

    <!--
        spring在建立物件的時候,宣告bean,就是告訴spring要建立某個類的物件
        id: 這個物件自定義名稱,唯一,spring通過這個id能找到物件
        class:類的全限定名稱(不能是介面的,因為spring是反射機制創造物件的)

        spring就完成這樣的工作   SomeService someService = new SomeServiceImpl();

        spring是把建立好的物件放入到map中,spring框架中有一個map存放物件
        spring.put(id值,物件)
        例:springMap.put("someService",new SomeServiceImpl());

        一個 bean 標籤宣告一個物件
    -->

    <bean id="someService" class="com.md.service.impl.SomeServiceImpl" />

</beans>
  1. spring在建立物件的時候,宣告bean,就是告訴spring要建立某個類的物件
  2. id: 這個物件自定義名稱,唯一,spring通過這個id能找到物件
  3. class:類的全限定名稱(不能是介面的,因為spring是反射機制創造物件的)

5. 定義測試類

spring預設建立物件的時間:在建立spring的容器時,就建立配置檔案中的<所有物件>

spring建立物件,預設呼叫的是無參的構造方法

   @Test
    public void test02(){
        // 使用spring容器建立物件,spring配置檔案在類路徑下
        // 1. 指定spring配置檔名稱
        String config = "beans.xml";

        //2. 表示建立spring容器的物件, ApplicationContext
        // ApplicationContext就是表示Spring容器,通過容器獲取物件了
        // ClassPathXmlApplicationContext:表示從類路徑中載入spring的配置檔案,
        // 如圖所示,得把beans.xml放到編譯好的target下面的classes中
        // 若自動放的話這裡就不用放了,如果出現找不到這個檔案的時候手動放就行了
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);

        System.out.println("------------------");

        //3. 從容器中獲取某個物件, 你要呼叫物件的方法
        //getBean("配置檔案中的bean的id值")
        SomeService someService = (SomeService) ac.getBean("someService");

        // 4. 使用spring建立好的物件來呼叫方法
        someService.doSome();



//        我是SomeServiceImpl的無參構造方法
//                ------------------
//        執行了SomeServiceImpl的doSome()方法

    }


當執行報錯找不到beans.xml檔案的時候,手動複製一個就可以了

6. 使用spring建立非自定義類物件

在Spring的配置檔案beans.xml中新增

 <!--
        spring能建立一個非自定義類的物件嗎?建立一個已經存在的類的物件
    -->

    <bean id="mydate" class="java.util.Date" />

在測試類

 /**
     * 獲取一個非自定義的類的物件
     */
    @Test
    public void test04(){
        String config = "beans.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);

        // 獲取物件
        Date d = (Date) ac.getBean("mydate");
        System.out.println(d);
    }

7. 獲取spring容器中java物件的資訊

   @Test
    public void test03(){

        String config = "beans.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);

        // 使用spring提供的方法,獲取容器中定義的物件的數量
        int count = ac.getBeanDefinitionCount();
        System.out.println(count);

        // 容器中定義的每個物件的名稱
        String[] names = ac.getBeanDefinitionNames();

        for (String name : names) {
            System.out.println(name);
        }

    }

三、使用Spring框架的步驟

  1. 加入依賴
  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
  1. 建立類:介面、實現類、或者沒有介面的類
  2. 建立spring的配置檔案,使用<bean>標籤宣告物件
 <bean id="someService" class="com.md.service.impl.SomeServiceImpl" />
  1. 我們使用容器中的物件,通過ApplicationContext介面和它的實現類ClassPathXmlApplicationContext的方法getBean("要使用的id")

四、總結

1. 什麼是spring

  1. 是一個框架,核心技術是ioc、aop,實現解耦合
  2. spring是一個容器,容器中存放的是java物件,需要做的是把物件放入到容器中

2. 怎麼使用spring

  1. spring是一個容器,把專案中用的物件放入到容器中
  2. 讓容器完成物件的建立、物件之間的關係的管理也就是屬性的賦值
  3. 我們在程式中從容器中獲取到想使用的物件

3. 什麼樣的物件放入容器中

  1. dao類、service類、controller類、工具類
  2. spring中物件預設都是單例,在容器中這個物件只有一個

4. 不放入spring容器中的物件

  1. 實體類物件,實體類的資料是來自資料庫的
  2. servlet、listener、filter等(這幾個是來自Tomcat的)

相關文章