Spring 創(chuàng)建與使用
一,Spring項目的創(chuàng)建
使用Maven方式來創(chuàng)建一個Spring項目,創(chuàng)建Spring項目和Servlet類似,總共分為以下3步:
- 創(chuàng)建一個普通Maven項目
- 添加 Spring 框架?持(spring-context、spring-beans)
- 添加啟動類
1.1,創(chuàng)建一個Maven項目
創(chuàng)建一個普通的Maven項目注意點:項目名稱和項目路徑中不能有任何中文。
當 Java源代碼根目錄出現顏色以及resources資源目錄出現標識圖像時,說明該Maven項目已經初始化完畢。
1.2,添加Spring框架依賴
在項目的 pom.xml 中添加 Spring 框架依賴(spring-context
依賴),xml 配置如下:
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.19</version>
</dependency>
</dependencies>
在項目的 pom.xml 配置文件中添加spring-context
依賴后,需點擊刷新鍵重新加載Maven項目,操作如下:
當在External Libra
目錄下出現下述6個庫,表明Spring-context
依賴添加成功。
疑問:我在pom.xml 中只添加了一個Spring-context
依賴,但為啥最終會有6個依賴呢?
解答:Spring-context
依賴的底層實現依賴于另外五個框架依賴,所以再添加Spring-context
依賴的同時也會把這另外5個也添加。
1.3,添加啟動類
在Java源代碼根目錄java下創(chuàng)建一個啟動類,該啟動類包含main方法即可。
該啟動類的功能是:為后面從Spring容器中讀取Bean做準備。
測試Maven項目是否創(chuàng)建成功,可通過在main方法里寫測試代碼,根據代碼能否成功運行來判斷。
注:上述測試代碼能夠正常運行,說明Maven項目創(chuàng)建以及配置成功。
二,存儲Bean
2.1,創(chuàng)建Bean對象
Bean對象就是 Java 語?中的?個普通對象,只是該對象能夠被多次調用并使用。
2.2,將Bean注冊到Spring
操作流程:在resources資源目錄下添加 Spring 配置?件spring-config.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 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
</beans>
在resources資源目錄下添加配置文件示意圖:
添加好配置文件后,再將Bean對象注冊到 Spring 中就可以,具體操作是在 中添加如下配置:
注:id
指明Bean對象名稱,class
指明Bean對象路徑(包名 + 類名)。
<bean id="student" class="org.example.Student"></bean>
上述表示含義為:將Bean(org.example.Student)存到Spring 容器中,它的名稱叫作student
。
三,讀取Bean
3.1,得到 Spring上下文
Spring 上下文對象的獲取可使用 ApplicationContex
,創(chuàng)建的時候需要配置 Spring 配置信息。
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
說明:ClassPathXmlApplicationContext
屬于ApplicationContext
的?類,擁有ApplicationContext
的所有功能,是通過 xml 的配置來獲取Spring容器中所有的 Bean對象。
注意:ClassPathXmlApplicationContext
里的參數configLocation
值應與Spring配置信息文件名相同。
3.2,獲取指定Bean對象
獲取指定Bean對象要求:getBean的參數值id
和class
要與指定Bean對象的id
和class
相對應。
Student student = context.getBean("student", Student.class);
獲取指定Bean對象示意圖:
3.3,使用Bean對象
student.sayHi();
讀取Bean對象并使用的總操作流程代碼:
import org.example.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
//1,獲得Spring對象上下文
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//2,獲取指定的Bean對象
Student student = context.getBean("student", Student.class);
//3,使用Bean對象(非必須)
student.sayHi();
}
}
讀取Bean對象并使用的總操作流程代碼執(zhí)行結果:
四,其他注意問題
4.1,獲取Spring上下文的兩種方式
1)ApplicationContext
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
ApplicationContext
執(zhí)行操作代碼:
public static void main(String[] args) {
//1,獲得Spring對象上下文
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//2,獲取指定的Bean對象
Student student = context.getBean("student", Student.class);
//3,使用Bean對象(非必須)
student.sayHi();
}
執(zhí)行 ApplicationContext
打印結果:
2)BeanFactory
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
BeanFactory
執(zhí)行操作代碼:
public static void main(String[] args) {
//1,獲得Spring對象上下文
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
//2,獲取指定的Bean對象
Student student = beanFactory.getBean("student", Student.class);
//3,使用Bean對象(非必須)
student.sayHi();
}
執(zhí)行 BeanFactoryt
打印結果:
3)兩種方式的區(qū)別
1,Student類(Bean對象)準備
public class Student {
public Student(){
System.out.println("do student init!");
}
public void sayHi(){
System.out.println("Hi student!");
}
}
2,Teacher類(Bean對象)準備
public class Teacher {
public Teacher(){
System.out.println("do teacher init!");
}
public void sayHi(){
System.out.println("Hi teacher!");
}
}
3,兩種方式對比
執(zhí)行 ApplicationContext
(無獲取指定的Bean對象操作) 打印結果:
執(zhí)行 BeanFactoryt
(有獲取指定的Bean對象操作) 打印結果:
執(zhí)行 BeanFactoryt
(有獲取指定的Bean對象操作) 打印結果:
4,兩種方式區(qū)別總結
ApplicationContext:該方式在獲取Spring對象上下文時會對Spring容器中的所有Bean對象進行加載初始化。
方式特征:比較耗內存,一次性加載,后續(xù)Bean對象的讀取不需進行加載初始化操作,效率高。
BeanFactory:該方式只有在調用getBean方法時才會進行加載初始化對應的Bean對象,而不是所有的Bean對象,屬于懶加載。
方式特征:比較省內存,懶加載,只有當調用getBean時才會加載初始化對應的Bean對象,效率不高。
ApplicationContext
和BeanFactory
的聯系:
ApplicationContext
和BeanFactory
都是接口,在使用時都是調用其的子類。
兩種方式對比區(qū)別:從繼承功能方面和性能方面這兩個方面進行比較說明。
- 繼承關系和功能方面:BeanFactory 提供了基礎的訪問容器的能力,而ApplicationContext是BeanFactory的子類,它除了繼承了BeanFactory的所有功能之外,它還擁有獨特的特性還添加了對國際化支持、資源訪問支持、以及事件傳播等方面的支持。
- 性能方面:ApplicationContext是一次性加載并初始化所有的Bean對象,而BeanFactory是需要哪個才去加載并初始化哪個,因此BeanFactory更加輕量,但效率不高。
4.2,獲取Bean對象的三種方式
1)通過名稱獲取
Student student = (Student) context.getBean("student");
該方式需經過兩步操作,先獲取到Bean對象,再經過強制類型轉換為對應的類型,而強制類型轉換容易出現空指針異常,不優(yōu)雅。
如果Bean對象名稱不存在,則會拋出NoSuchBeanDefinitionException
異常。
2)通過類名獲取
Student student = context.getBean(Student.class);
該方式存在缺陷,當有?個類型被重復注冊到 spring-config.xml 中時,不可使用該方式,若使用則會拋出NoUniqueBeanDefinitionException
異常(非唯一的Bean異常)。
3)通過名稱+類名獲取
該方式推薦使用,既避免了強制類型轉換帶來的空指針異常問題,也避免了只根據類名獲取Bean方式帶來的非唯一的Bean異常問題。
Student student = context.getBean("student", Student.class);
本文總結
1,Spring 創(chuàng)建與使用流程?
解答:Spring 創(chuàng)建與使用的流程分為三大步,分別為Spring項目的創(chuàng)建,Bean對象的存儲以及Bean對象的讀取。具體流程為:
1)Spring項目的創(chuàng)建
- 創(chuàng)建一個Maven項目
- 添加Spring框架依賴 【spring-context】
- 添加啟動類 【功能:為后面從Spring容器中讀取Bean做準備】
2)存儲Bean
- 創(chuàng)建Bean對象
- 將Bean注冊到Spring容器中 【spring-config.xml配置文件】
3)讀取Bean
- 得到Spring 對象【ApplicationContext,BeanFactory】
- 通過Spring 對象的 getBean() 方法獲取到Bean對象 【DI操作】
- 使用Bean對象 【非必須】
Spring 創(chuàng)建與使用的流程示意圖:
2,獲取Spring的兩種方式?區(qū)別?
1)ApplicationContext:在獲取Spring對象上下文時會對Spring容器中的所有Bean對象進行加載初始化。
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
2)BeanFactory:只有在調用getBean方法時才會進行加載初始化對應的Bean對象,而不是所有的Bean對象。
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"))
3)兩種方式區(qū)別:從繼承功能方面和性能方面兩個方面進行比較說明。
- 繼承關系和功能方面:BeanFactory 提供了基礎的訪問容器的能力,而ApplicationContext是BeanFactory的子類,它除了繼承了BeanFactory的所有功能之外,它還擁有獨特的特性還添加了對國際化支持、資源訪問支持、以及事件傳播等方面的支持。
- 性能方面:ApplicationContext是一次性加載并初始化所有的Bean對象,而BeanFactory是需要哪個才去加載并初始化哪個,因此BeanFactory更加輕量,但效率不高。
3,獲取Bean對象的三種方式?
1)通過名稱獲取:有缺陷,需要進行強制性轉換,而強制類型轉換容易出現空指針異常。
Student student = (Student) context.getBean("student");
2)通過類名獲取:有缺陷,當同類型的Bean對象有多個時,拋出NoUniqueBeanDefinitionException
異常(非唯一的Bean異常)。
Student student = context.getBean(Student.class);
3)通過名稱+類名獲取:推薦使用,規(guī)避了上述問題。
Student student = context.getBean("student", Student.class);
結語
這就是本期博客的全部內容啦!如果有什么其他的問題無法自己解決,可以在評論區(qū)留言哦!
最后,如果你覺得這篇文章寫的還不錯的話或者有所收獲的話,麻煩小伙伴們動動你們的小手,給個三連唄(點贊??,評論?,收藏??),多多支持一下!各位的支持是我最大的動力,后期不斷更新優(yōu)質的內容來幫助大家,一起進步。那我們下期見!文章來源:http://www.zghlxwxcb.cn/news/detail-564991.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-564991.html
到了這里,關于【框架篇】Spring 創(chuàng)建與使用介紹的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!