一. Spring項(xiàng)目的創(chuàng)建
1. 創(chuàng)建Maven項(xiàng)目
第一步,創(chuàng)建 Maven 項(xiàng)目,Spring 也是基于 Maven 的。
2. 配置國(guó)內(nèi)源
由于國(guó)外源不穩(wěn)定,可能讓下面第二步引入 Spring 依賴會(huì)失敗,所以這里先介紹如何一下配置國(guó)內(nèi)鏡像源。
現(xiàn)成的settings.xml
文件鏈接:gitee
如果你已經(jīng)有了settings.xml
文件,但沒(méi)有配置mirror
,配置內(nèi)容如下:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
如果你是在引入相關(guān)依賴失敗后進(jìn)行的國(guó)內(nèi)源配置,就要去本地管理jar
包的目錄將jar
包都進(jìn)行刪除,然后重新刷新下載依賴即可。
3. 添加spring依賴
第二步,在 Maven 項(xiàng)目中添加 Spring 的支持(spring-context, spring-beans)
在pom.xml
文件添加依賴項(xiàng)。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
刷新等待加載完成。
4. 創(chuàng)建啟動(dòng)類
第三步,創(chuàng)建啟動(dòng)類與main
方法,用來(lái)做簡(jiǎn)單的測(cè)試
在 java
目錄創(chuàng)建類,寫代碼即可,因?yàn)檫@里只演示怎么創(chuàng)建 Spring 項(xiàng)目和介紹 Spring 的簡(jiǎn)單使用,不會(huì)就上線發(fā)布,就不按照 Maven 的模板目錄結(jié)構(gòu)來(lái)搞了。
二.儲(chǔ)存或讀取Bean對(duì)象
1. 添加spring配置文件
右鍵resources
目錄,新建一個(gè)spring-config.xml
配置文件。
配置內(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">
</beans>
2. 創(chuàng)建Bean對(duì)象
第一步,創(chuàng)建Bean
對(duì)象。
比如我們要注入一個(gè)Student
對(duì)象,就先的創(chuàng)建一個(gè)Student
類。
package com.tr.demo;
public class Student {
public void sayHi(String name) {
System.out.println("Hello!" + name );
}
}
然后將Bean
通過(guò)配置文件,注入到spring
中,即在spring
配置文件中通過(guò)以下語(yǔ)句注入。
<bean id="student" class="com.tr.demo.Student"></bean>
spring中對(duì)象的儲(chǔ)存是通過(guò)鍵值對(duì)來(lái)存儲(chǔ)的,其中key
為id
,value
為bean
,id
一般使用小駝峰命名。
3. 讀取Bean對(duì)象
想要從 Spring 中將Bean
對(duì)象讀取出來(lái),先要得到 Spring 上下文對(duì)象,相當(dāng)于得到了 Spring 容器。
再通過(guò) spring 上下文對(duì)象提供的方法獲取到需要使用的Bean
對(duì)象,最后就能使用Bean
對(duì)象了。
ApplicationContext
,也稱為控制反轉(zhuǎn)(IoC)容器,是 Spring 框架的核心。
實(shí)現(xiàn)類 | 描述 |
---|---|
ClassPathXmlApplicationContext(常用) | 加載類路徑下的配置文件,要求配置文件必須在類路徑下 |
FileSystemXmlApplicationContext | 可以加載磁盤任意路徑下的配置文件(必須要有訪問(wèn)權(quán)限) |
AnnotationContigApplicationContext | 用于讀取注解創(chuàng)建容器 |
import com.tr.demo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class APP {
public static void main(String[] args) {
// 1. 得到上下文對(duì)象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
// 2. 獲取 bean 對(duì)象,這里根據(jù) id 獲取
Student student = (Student) context.getBean("student");
// 3. 使用 bean
student.sayHi("張三");
}
}
運(yùn)行結(jié)果:
還可以使用 Bean 工廠(舊)來(lái)獲取 Bean。
import com.tr.demo.Student;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class APP2 {
public static void main(String[] args) {
// 1. 得到 bean 工廠
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
// 2. 獲取 bean 對(duì)象
Student student = (Student) factory.getBean("student");
// 3. 使用 bean
student.sayHi("李四");
}
}
但實(shí)際上并不推薦使用這種方式,算是過(guò)時(shí)代的方式了,因?yàn)榕f時(shí)期需要考慮內(nèi)存占用的問(wèn)題,而現(xiàn)在內(nèi)存資源沒(méi)有這樣的問(wèn)題了。
運(yùn)行結(jié)果:
此時(shí)我們可以發(fā)現(xiàn),ApplicationContext
與BeanFactory
都可以從容器中獲取Bean
,都提供了getBean
方法,最終的效果是一樣的。
??那么,ApplicationContext
與BeanFactory
有什么區(qū)別?
??相同點(diǎn):
- 都是容器管理對(duì)象,都可以從容器中獲取
Bean
,都提供了getBean
方法。
??不同點(diǎn):
-
ApplicationContext
是BeanFactory
的子類,BeanFactory
只提供了基礎(chǔ)訪問(wèn)Bean
對(duì)象的功能,而ApplicationContext
除了擁有BeanFactory
的全部功能,還有其他額外功能的實(shí)現(xiàn),如國(guó)際化,資源訪問(wèn)以及事務(wù)傳播方面等功能的支持。 - 它們兩加載
Bean
的機(jī)制也是不同的,BeanFactory
按需加載Bean
,屬于懶漢方式,使用它程序啟動(dòng)快,在后期獲取對(duì)象時(shí)會(huì)慢一些;而ApplicationContext
是餓漢方式,在創(chuàng)建時(shí)會(huì)將一次性將所有的Bean
都加載,這種方式啟動(dòng)慢,啟動(dòng)之后獲取對(duì)象就非??炝?。
這里驗(yàn)證一下他們兩的加載機(jī)制:
我們?cè)?com.tr.demo 目錄下再添加一個(gè)Teacher
類,并完善Teacher
與Student
類的構(gòu)造方法,這樣當(dāng)類被構(gòu)造時(shí)會(huì)給出一些提示信息,在獲取上下文或工廠時(shí)根據(jù)這些信息我們就可以知道Bean
是否會(huì)被構(gòu)造。
package com.tr.demo;
public class Teacher {
public Teacher() {
System.out.println("Teacher 已加載!");
}
public void sayHi(String name) {
System.out.println("Hello!" + name );
}
}
package com.tr.demo;
public class Student {
public Student() {
System.out.println("Student 已加載!");
}
public void sayHi(String name) {
System.out.println("Hello!" + name );
}
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class APP3 {
public static void main(String[] args) {
// 1. 得到上下文對(duì)象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
}
}
運(yùn)行結(jié)果:
程序啟動(dòng),ApplicationContext
創(chuàng)建時(shí),會(huì)將所有的Bean
對(duì)象都構(gòu)造,類似于餓漢的方式。
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class APP4 {
public static void main(String[] args) {
// 1. 得到 bean 工廠
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
}
}
運(yùn)行結(jié)果:
程序啟動(dòng),在BeanFactory
創(chuàng)建時(shí),結(jié)果中沒(méi)有如何輸出,只要不去獲取使用Bean
就不會(huì)去加載,類似于懶漢的方式。
getBean
方法,其實(shí)是有三種使用方式的,具體如下:
1??方式1:根據(jù)Bean
的名字來(lái)獲取
Student student = (Student) context.getBean("student");
這種方式返回的是一個(gè)Object
對(duì)象,需要我們?nèi)ミM(jìn)行強(qiáng)制類型轉(zhuǎn)換。
2??方式2:根據(jù)Bean
類型獲取
Student student = context.getBean(Student.class);
這種方式當(dāng)beans
中只有一個(gè)類的實(shí)例沒(méi)有問(wèn)題,但是個(gè)有多個(gè)同類的實(shí)例,會(huì)有問(wèn)題,即在 Spring 中注入多個(gè)同一個(gè)類的對(duì)象,就會(huì)報(bào)錯(cuò)。
我們來(lái)試一下,首先在 Spring 配置文件,注入多個(gè)Student
對(duì)象:
然后我們?cè)偻ㄟ^(guò)這種方式來(lái)獲取對(duì)象,運(yùn)行結(jié)果如下:
拋出了一個(gè)NoUniqueBeanDefinitionException
異常,這表示注入的對(duì)象不是唯一的。
3??方式3:根據(jù)名稱 + 類型獲取
Student student = context.getBean("student",Student.class);
相比方式1,更加健壯和優(yōu)雅,也沒(méi)有方式 2 中的問(wèn)題
總結(jié):
通篇下來(lái)涉及以下流程:
①創(chuàng)建 Spring 項(xiàng)目
②存儲(chǔ) Bean文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-580857.html
- 先創(chuàng)建 Bean 對(duì)象
- 將 Bean 在 pring-config.xml 中進(jìn)行配置
③取對(duì)象文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-580857.html
- 得到 Spring 上下文,讀取 Spring 配置文件
- 獲取 Bean 對(duì)象
- 使用 Bean 對(duì)象(可選項(xiàng))
到了這里,關(guān)于Spring項(xiàng)目創(chuàng)建與Bean的存儲(chǔ)與讀取(DL)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!