【Spring學習筆記】1:開發環境,BeanFactory和ApplicationContext兩類容器
阿新 • • 發佈:2019-02-17
開發環境
和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上的方法。
這兩種這個介面的介面實現類ClassPathXmlApplicationContext
和FileSystemXmlApplicationContext
的構造器傳入的檔案路徑的當前目錄是不同的,前者是在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
劉知昊