1. 程式人生 > >【Spring學習筆記】1:開發環境,BeanFactory和ApplicationContext兩類容器

【Spring學習筆記】1:開發環境,BeanFactory和ApplicationContext兩類容器

開發環境

和Struts2,Hibernate一樣把下載的jar包放在WEB-INF/lib/下就可以了,最小依賴是:
這裡寫圖片描述
其中commons-logging-*.jar是額外的,不是Spring自帶的。

BeanFactory容器

是為依賴注入(DI)提供支援的容器,功能不多但是速度快,一般不用。

Bean的概念

Bean就是受Ioc(控制反轉)容器管理的JavaBean,就像POJO是受ORM容器管理的JavaBean一樣。Spring的核心功能就是一個IoC容器。

Beans.xml

這個XML檔案是配置容器管理的一些Bean的,檔名可以改,檔案的位置也可以變(一般直接在src

下),我放在了一個包下。

<?xml version="1.0" encoding="UTF-8"?>

<!-- 配置一些容器管理的Bean的物件 -->
<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"
>
<!-- 給出這個物件的ID值(賦予一個唯一的名稱),實現類 --> <bean id="lzh" class="myBean.Student"> <!-- 要傳遞進去的物件的屬性名,屬性值 --> <property name="id" value="1856" /> <property name="stuName" value="劉知昊" /> </bean> </beans>

Main.java

Bean類就省略了,建了一個學生類。下面是書上提供的一種使用BeanFactory的方式。

package mainTST;

import myBean.Student;

import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.ClassPathResource;

public class Main {

    public static void main(String[] args) {
        // 根據Bean配置檔案建立ClassPathResource物件
        ClassPathResource cpr = new ClassPathResource("./myXML/Beans.xml");
        // 建立Bean的工廠
        DefaultListableBeanFactory dlbf = new DefaultListableBeanFactory();
        // 建立載入Bean的介面,傳入這個工廠以和它繫結
        XmlBeanDefinitionReader xbdr = new XmlBeanDefinitionReader(dlbf);
        // 使用介面中提供的方法,利用ClassPathResource物件提供的資訊載入這些Bean到工廠中
        xbdr.loadBeanDefinitions(cpr);

        // 從Bean的工廠中根據配置檔案中的唯一id來獲取具體的Bean
        Student sbLzh = (Student) dlbf.getBean("lzh");

        // 輸出看一下
        System.out.println(sbLzh.getId());
        System.out.println(sbLzh.getStuName());
    }
}

MainApp.java

下面是W3Cschool上的方法,比較方便。

package mainTST;

import myBean.Student;

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

public class MainApp {

    public static void main(String[] args) {
        // 建立應用程式的上下文,載入Beans的配置檔案
        ApplicationContext apct = new ClassPathXmlApplicationContext(
                "./myXML/Beans.xml");
        // 使用Bean的ID返回一個最終可以轉換為實際物件的通用物件
        Student sbLzh = (Student) apct.getBean("lzh");

        // 輸出看一下
        System.out.println(sbLzh.getId());
        System.out.println(sbLzh.getStuName());
    }
}

控制檯輸出

兩種方法結果是一樣的,相當於Bean配置檔案裡的物件被構建了出來。

1856
劉知昊

ApplicationContext容器

一般用這個,功能強大。這個介面是前面的BeanFactory介面的子介面。相比前者不僅包含其所有功能,這個容器還增加了其它的功能。

Main.java

書上的方法。

因為ClassPathXmlApplicationContext類實現了java.io.Closeable介面,所以用完要關閉,所以乾脆不要做上轉型了,ApplicationContext接口裡是沒有close()方法的。

package mainTST;

import myBean.Student;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {

    public static void main(String[] args) {
        // 建立應用程式的上下文,載入Beans的配置檔案,生成和初始化所有的物件
        ClassPathXmlApplicationContext apct = new ClassPathXmlApplicationContext(
                "./myXML/Beans.xml");
        // 使用Bean的ID返回一個最終可以轉換為實際物件的通用物件
        Student sbLzh = (Student) apct.getBean("lzh");
        // 用完關閉
        apct.close();

        // 輸出看一下
        System.out.println(sbLzh.getId());
        System.out.println(sbLzh.getStuName());
    }

}

MainApp.java

下面是W3Cschool上的方法。

這兩種這個介面的介面實現類ClassPathXmlApplicationContextFileSystemXmlApplicationContext的構造器傳入的檔案路徑的當前目錄是不同的,前者是在src下,而後者是在當前工程目錄下。

另外還有一種介面實現叫WebXmlApplicationContext,會在web應用程式範圍內載入。

package mainTST;

import myBean.Student;

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

public class MainApp {

    public static void main(String[] args) {
        // 建立應用程式的上下文,載入Beans的配置檔案,生成和初始化所有的物件
        ApplicationContext apct = new FileSystemXmlApplicationContext(
                "./src/myXML/Beans.xml");
        // 使用Bean的ID返回一個最終可以轉換為實際物件的通用物件
        Student sbLzh = (Student) apct.getBean("lzh");

        // 輸出看一下
        System.out.println(sbLzh.getId());
        System.out.println(sbLzh.getStuName());
    }

}

控制檯輸出

1856
劉知昊