網(wǎng)頁(yè)設(shè)計(jì)公司金華關(guān)鍵詞排名優(yōu)化公司外包
文章目錄
- 前言
- 一、Spring 項(xiàng)目的創(chuàng)建
- 1.1 創(chuàng)建 Maven 項(xiàng)目
- 1.2 添加 Spring 框架支持
- 1.3 添加啟動(dòng)類
- 二、儲(chǔ)存 Bean 對(duì)象
- 2.1 創(chuàng)建 Bean
- 2.1 將 Bean 注冊(cè)到 Spring 容器
- 三、獲取并使用 Bean 對(duì)象
- 3.1 獲取Spring 上下文
- 3.2 ApplicationContext 和 BeanFactory 的區(qū)別
- 3.3 獲取指定的 Bean 對(duì)象
- 四、總結(jié)
前言
通過前面的文章我們知道了,Spring 其實(shí)就是一個(gè)包含了眾多工具的 IoC 容器。既然是容器那么主要就涉及到兩個(gè)操作,即:
- 將對(duì)象儲(chǔ)存到 Spring 容器中;
- 使用的使用將對(duì)象從 Spring 容器中取出。
因此,學(xué)習(xí) Spring 容器,主要就是學(xué)習(xí)它的存取操作。下文詳細(xì)介紹了 Spring 項(xiàng)目的創(chuàng)建與使用。
一、Spring 項(xiàng)目的創(chuàng)建
下文將以 Maven 的方式來創(chuàng)建一個(gè) Spring 項(xiàng)目,創(chuàng)建 Spring 項(xiàng)目的方式與 Servlet 類似,主要分為以下三步驟:
- 創(chuàng)建 Maven 項(xiàng)目;
- 添加 Spring 框架支持;
- 添加啟動(dòng)類。
以下就是圍繞這三個(gè)步驟來創(chuàng)建 Spring 項(xiàng)目的具體過程。
1.1 創(chuàng)建 Maven 項(xiàng)目
創(chuàng)建好后其目錄結(jié)構(gòu)如下:
1.2 添加 Spring 框架支持
- 在 Maven 中央倉(cāng)庫(kù)搜索 Spring,選擇 “Spring Context”:
- 選擇
5.xxxx
版本
- 選擇 Maven,然后將其復(fù)制粘貼到
pom.xml
文件中
最后的 pom.xml
文件樣式如下:
1.3 添加啟動(dòng)類
即在 Java
目錄下創(chuàng)建一個(gè)類,其中包含一個(gè) main
方法即為啟動(dòng)類:
二、儲(chǔ)存 Bean 對(duì)象
什么是 Bean:
在 Spring 框架中,Bean 是一個(gè)非常重要的概念,它是Spring容器中被管理和維護(hù)的對(duì)象。Bean 可以是任何的Java對(duì)象,例如 POJO(Plain Old Java Object)、實(shí)體類、服務(wù)類等。這些對(duì)象在 Spring 容器中被實(shí)例化、組裝、管理和銷毀,以提供各種功能和服務(wù)。
儲(chǔ)存 Bean 分為兩個(gè)步驟:
- 先創(chuàng)建 Bean 類;
- 然后將創(chuàng)建的 Bean 注冊(cè)到 Spring 容器中。
2.1 創(chuàng)建 Bean
此處以一個(gè) Student 類為例:
public class Student {public Student(){System.out.println("init student");}public void sayHi(){System.out.println("Hi, I am a student.");}
}
2.1 將 Bean 注冊(cè)到 Spring 容器
要想將 Bean 對(duì)象注冊(cè)到 Spring 容器中,首先需要在 resources
目錄下創(chuàng)建一個(gè)配置文件,一般取名為 spring-config.xml
:
Spring 配置文件的固定為以下內(nèi)容:
<?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 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
</beans>
然后將 Student 對(duì)象注冊(cè)到 Spring 中,即在 <beans>
添加以下配置:
其中 id
字段表示給 Bean 取的名,class
字段則是 包名 + 類名
。
三、獲取并使用 Bean 對(duì)象
獲取并使用 Bean 對(duì)象也大致可分為以下三步:
- 獲取 Spring 上下文對(duì)象,因?yàn)閷?duì)象都交給 Spring 管理了,所有要獲取 Spring 中的 Bean,首先就需要獲取 Spring;
- 通過回去的 Spring 上下文對(duì)象,獲取指定的 Bean 對(duì)象;
- 使用 Bean 對(duì)象。
3.1 獲取Spring 上下文
獲取 Spring 上下文對(duì)象的方式主要有兩個(gè),即使用ApplicationContext
和BeanFactory
來獲取。
1. 使用ApplicationContext
獲取
public static void main(String[] args) {ApplicationContext context =new ClassPathXmlApplicationContext("spring-config.xml");}
2. 使用BeanFactory
獲取
public static void main(String[] args) {BeanFactory beanFactory =new XmlBeanFactory(new ClassPathResource("spring-config.xml"));}
3.2 ApplicationContext 和 BeanFactory 的區(qū)別
此時(shí),分別執(zhí)行 ApplicationContext
和 BeanFactory
獲取 Spring 上下文對(duì)象的 main
方法:
ApplicationContext
:
此時(shí),可以發(fā)現(xiàn)當(dāng)使用 ApplicationContext
獲取 Spring 上下文的時(shí)候,會(huì)立即初始化 Spring 容器中的 Bean 對(duì)象。
BeanFactory
:
當(dāng)使用BeanFactory
獲取 Spring 上下文的時(shí)候,并沒有立即初始化 Spring 中的 Bean 對(duì)象,而是在獲取 Bean 對(duì)象的時(shí)候才初始化,即是一種懶加載模式。
ApplicationContext
和 BeanFactory
之間的區(qū)別可總結(jié)如下:
繼承關(guān)系和功能層面:
ApplicationContext
接口繼承了BeanFactory
接口,其中BeanFactory
提供了基礎(chǔ)的訪問容器的能力,而ApplicationContext
除了繼承BeanFactory
的所有功能之外,還擁有獨(dú)特的功能,比如添加了對(duì)國(guó)際化的支持、資源的訪問支持、事件傳播等方面的支持。
性能方面:
ApplicationContext
是?次性加載并初始化所有的 Bean 對(duì)象,而BeanFactory
是需要哪個(gè) Bean 對(duì)象的時(shí)候才會(huì)去加載,因此更加輕量。- 因此當(dāng)性能要求較高而內(nèi)存充足的場(chǎng)景下推薦使用
ApplicationContext
;而在內(nèi)存空間較小,對(duì)性能要求不高的場(chǎng)景下推薦使用BeanFactory
。
3.3 獲取指定的 Bean 對(duì)象
- 直接通過 Bean 對(duì)象的名稱獲取
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
Student student = (Student) context.getBean("student");
getBean
方法直接通過 Bean 對(duì)象的名稱獲取返回的是一個(gè) Object
對(duì)象,因此需要強(qiáng)制類型轉(zhuǎn)換。
- 通過 Bean 的類型獲取
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
Student student = context.getBean(Student.class);
getBean
方法通過 Bean 對(duì)象的類型獲取,此時(shí)不需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,但是這種方法存在一個(gè)問題:如果當(dāng) Spring 容器中存在多個(gè)相同類型的 Bean 對(duì)象的時(shí)候就會(huì)出現(xiàn)歧義,即找不到返回哪個(gè)對(duì)象。
比如在 Spring 容器中再添加一個(gè) Student 對(duì)象:
此時(shí)啟動(dòng) main
函數(shù)的時(shí)候,就會(huì)出現(xiàn)如下問題:
此時(shí),Spring 容器中存在兩個(gè)相同類型的 Bean 對(duì)象,而通過類型獲取的話,就不知道獲取哪一個(gè)了。因此要解決這個(gè)問題就可以采用 通過 Bean 名稱 + 類型獲取
。
- 通過 Bean 名稱 + 類型獲取
public static void main(String[] args) {ApplicationContext context =new ClassPathXmlApplicationContext("spring-config.xml");Student student = context.getBean("student", Student.class);Student student2 = context.getBean("student2", Student.class);student.sayHi();student2.sayHi();}
此時(shí),通過 Bean 名稱 + 類型獲取的方式,即使是 Spring 容器中存在多個(gè)相同類型的 Bean 對(duì)象,但由于其名稱不同,也能夠正確獲取到指定的 Bean 對(duì)象。
四、總結(jié)
以上詳細(xì)介紹了 Spring 項(xiàng)目的創(chuàng)建和使用過程,下面是對(duì)其整個(gè)流程的總結(jié)。
- 通過 Maven 項(xiàng)目創(chuàng)建 Spring 項(xiàng)目,并且還要添加對(duì) Spring 框架的支持;
- 創(chuàng)建 Bean 對(duì)象,然后通過
spring-config.xml
配置文件將其儲(chǔ)存到 Spring 容器中; - 獲取 Bean 對(duì)象:
- 首先通過
ApplicationContext
或者BeanFactory
獲取配置文件,即獲取 Spring 上下文對(duì)象。 - 通過
getBean
方法獲取 Bean 對(duì)象。 - 使用 Bean 對(duì)象。
- 首先通過