Spring系列第三講 Spring容器基本使用及原理

qwer1030274531發表於2020-10-28

IOC容器

IOC容器是具有依賴注入功能的容器,負責物件的例項化、物件的初始化,物件和物件之間依賴關係配置、物件的銷燬、對外提供物件的查詢等操作,物件的整個生命週期都是由容器來控制。我們需要使用的物件都由ioc容器進行管理,不需要我們再去手動透過new的方式去建立物件,由ioc容器直接幫我們組裝好,當我們需要使用的時候直接從ioc容器中直接獲取就可以了。

那麼spring ioc容器是如何知道需要管理哪些物件呢?

需要我們給ioc容器提供一個配置清單,這個配置支援xml格式和java註解的方式,在配置檔案中列出需要讓ioc容器管理的物件,以及可以指定讓ioc容器如何構建這些物件,當spring容器啟動的時候,就會去載入這個配置檔案,然後將這些物件給組裝好以供外部訪問者使用。

這裡所說的IOC容器也叫spring容器。

Bean概念

由spring容器管理的物件統稱為Bean物件。Bean就是普通的java物件,和我們自己new的物件其實是一樣的,只是這些物件是由spring去建立和管理的,我們需要在配置檔案中告訴spring容器需要建立哪些bean物件,所以需要先在配置檔案中定義好需要建立的bean物件,這些配置統稱為bean定義配置後設資料資訊,spring容器透過讀取這些bean配置後設資料資訊來構建和組裝我們需要的物件。

Spring容器使用步驟

  1. 引入spring相關的maven配置

  2. 建立bean配置檔案,比如bean xml配置檔案

  3. 在bean xml檔案中定義好需要spring容器管理的bean物件

  4. 建立spring容器,並給容器指定需要裝載的bean配置檔案,當spring容器啟動之後,會載入這些配置檔案,然後建立好配置檔案中定義好的bean物件,將這些物件放在容器中以供使用

  5. 透過容器提供的方法獲取容器中的物件,然後使用

Spring容器物件

spring內部提供了很多表示spring容器的介面和物件,我們來看看比較常見的幾個容器介面和具體的實現類。

BeanFactory介面

org.springframework.beans.factory.BeanFactory1

spring容器中具有代表性的容器就是BeanFactory介面,這個是spring容器的頂層介面,提供了容器最基本的功能。

常用的幾個方法

//按bean的id或者別名查詢容器中的beanObject getBean(String name) throws BeansException//這個是一個泛型方法,按照bean的id或者別名查詢指定型別的bean,返回指定型別的bean物件<T> T getBean(String name, Class<T> requiredType) throws BeansException;//返回容器中指定型別的bean物件<T> T getBean(Class<T> requiredType) throws BeansException;//獲取指定型別bean物件的獲取器,這個方法比較特別,以後會專門來講<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);1234567891011

ApplicationContext介面

org.springframework.context.ApplicationContext1

這個介面繼承了BeanFactory介面,所以內部包含了BeanFactory所有的功能,並且在其上進行了擴充套件,增加了很多企業級功能,比如AOP、國際化、事件支援等等。。

ClassPathXmlApplicationContext類

org.springframework.context.support.ClassPathXmlApplicationContext1

這個類實現了ApplicationContext介面,注意一下這個類名稱包含了ClassPath Xml,說明這個容器類可以從classpath中載入bean xml配置檔案,然後建立xml中配置的bean物件,一會後面的案例就會用到這個類。

AnnotationConfigApplicationContext類

org.springframework.context.annotation.AnnotationConfigApplicationContext1

這個類也實現了ApplicationContext介面,注意其類名包含了Annotation和config兩個單詞,上面我們有說過,bean的定義支援xml的方式和註解的方式,當我們使用註解的方式定義bean的時候,就需要用到這個容器來裝載了,這個容器內部會解析註解來構建構建和管理需要的bean。

註解的方式相對於xml方式更方便一些,也是我們比較推薦的方式,後面我們會大量使用這種方式,具體會詳解。

案例

來個helloworld來詳細看一下spring如何使用。

建立專案spring-series
使用idea建立maven專案spring-series,專案座標:

<groupId>com.javacode2018</groupId><artifactId>spring-series</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version>1234

spring-series專案中建立一個子模組lesson-001,專案maven父子結構

spring-series/pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="
         xmlns:xsi="
         xsi:schemaLocation="
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.javacode2018</groupId>
    <artifactId>spring-series</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>lesson-001</module>
    </modules>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- 配置maven編譯的時候採用的編譯器版本 -->
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
        <!-- 指定原始碼是什麼版本的,如果原始碼和這個版本不符將報錯,maven中執行編譯的時候會用到這個配置,預設是1.5,這個相當於javac命令後面的-source引數 -->
        <maven.compiler.source>1.8</maven.compiler.source>
        <!-- 該命令用於指定生成的class檔案將保證和哪個版本的虛擬機器進行相容,maven中執行編譯的時候會用到這個配置,預設是1.5,這個相當於javac命令後面的-target引數 -->
        <maven.compiler.target>1.8</maven.compiler.target>
        <spring.version>5.2.3.RELEASE</spring.version>
    </properties>
    <dependencyManagement>
       <dependencies>
           <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-core</artifactId>
               <version>${spring.version}</version>
           </dependency>
           <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-context</artifactId>
               <version>${spring.version}</version>
           </dependency>
           <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-beans</artifactId>
               <version>${spring.version}</version>
           </dependency>
       </dependencies>
    </dependencyManagement></project>123456789101112131415161718192021222324252627282930313233343536373839404142434445

目前我們使用spring最新的版本5.2.3.RELEASE,需要引入spring提供的3個構件

spring-core、spring-context、spring-beans1

lesson-001\pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="
         xmlns:xsi="
         xsi:schemaLocation="
    <parent>
        <artifactId>spring-series</artifactId>
        <groupId>com.javacode2018</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>lesson-001</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </dependency>
    </dependencies></project>1234567891011121314151617181920212223242526272829

lesson-001中建立HelloWord類

package com.javacode2018.lesson001.demo1;public class HelloWorld {
    public void say() {
        System.out.println("hello,歡迎和【路人甲Java】一起學spring!");
    }}1234567

HelloWord中我們建立了一個say方法,裡面會輸一段文字。 /nanning/

使用spring容器

下面我們透過spring容器來建立HelloWord物件,並從容器中獲取這個物件,然後呼叫其say方法輸出文字。

建立bean xml配置檔案

新建一個檔案,檔案路徑如下: /shanxi/

spring-series\lesson-001\src\main\resources\com\javacode2018\lesson001\demo1\bean.xml1

bean.xml內容如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="
       xmlns:xsi="
       xsi:schemaLocation="
    /spring-beans-4.3.xsd">
    <!--
    定義一個bean
    id:bean的唯一標識,可以透過這個標識從容器中獲取這個bean物件
    clss:這個bean的型別,完整類名稱    -->
    <bean id="helloWorld" class="com.javacode2018.lesson001.demo1.HelloWorld"/></beans>1234567891011121314

上面就是bean的定義檔案,每個xml中可以定義多個bean元素,透過bean元素定義需要spring容器管理的物件,bean元素需指定id和class屬性 /audio/

  • id表示這個bean的標識,在容器中需要唯一,可以透過這個id從容器中獲取這個物件;

  • class用來指定這個bean的完整類名

上面的配置檔案中我們定義了一個helloWorld標識的HellWorld型別的bean物件。

建立測試類

建立一個Client類,如下:

package com.javacode2018.lesson001.demo1;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Client {
    public static void main(String[] args) {
        //1.bean配置檔案位置
        String beanXml = "classpath:/com/javacode2018/lesson001/demo1/beans.xml";
        //2.建立ClassPathXmlApplicationContext容器,給容器指定需要載入的bean配置檔案
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(beanXml);
        //3.從容器中獲取需要的bean
        HelloWorld helloWorld = context.getBean("helloWorld", HelloWorld.class);
        //4.使用物件
        helloWorld.say();
    }}12345678910111213141516171819202122

上面main方法中有容器的詳細使用步驟,需要先建立容器物件,建立容器的物件的時候需要指定bean xml檔案的位置,容器啟動之後會載入這些配檔案,然後將這些物件構建好。 /harm/

程式碼中透過容器提供的getBean方法從容器中獲取了HellWorld物件,第一個引數就是xml中bean的id,第二個引數為bean對應的Class物件。

執行輸出

hello,歡迎和【路人甲Java】一起學spring!1

總結

本文主要介紹了spring容器的概念、bean的概念、常見的spring容器,以及spring容器的使用步驟;下一篇我們將詳解bean的定義。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30239065/viewspace-2730698/,如需轉載,請註明出處,否則將追究法律責任。

相關文章