在您的應用程式中,由Spring IoC容器管理的形成其核心的對象被稱為"bean"。一個bean是由Spring IoC容器實例化、組裝和管理的對象。這些bean是通過您提供給容器的配置元數據創建的,例如,在前面章節中已經看到的XML <bean/> 定義。 Bean定義包含了所謂的配置元數據,容 ...
在您的應用程式中,由Spring IoC容器管理的形成其核心的對象被稱為"bean"。一個bean是由Spring IoC容器實例化、組裝和管理的對象。這些bean是通過您提供給容器的配置元數據創建的,例如,在前面章節中已經看到的XML <bean/>
定義。
Bean定義包含了所謂的配置元數據,容器需要瞭解以下內容:
- 如何創建一個bean
- Bean的生命周期詳細信息
- Bean的依賴關係
上述所有的配置元數據都轉化為每個bean定義的以下屬性集合。
序號 | 屬性和描述 |
---|---|
1 | class |
這是必填屬性,指定要用於創建bean的bean類。 | |
2 | name |
此屬性唯一地指定bean標識符。在基於XML的配置元數據中,您可以使用id和/或name屬性來指定bean標識符。 | |
3 | scope |
此屬性指定從特定bean定義創建的對象的範圍,將在bean範圍章節中討論。 | |
4 | constructor-arg |
這用於註入依賴項,將在後續章節中討論。 | |
5 | properties |
這用於註入依賴項,將在後續章節中討論。 | |
6 | autowiring mode |
這用於註入依賴項,將在後續章節中討論。 | |
7 | lazy-initialization mode |
延遲初始化的bean告訴IoC容器在首次請求時創建bean實例,而不是在啟動時創建。 | |
8 | initialization method |
在容器設置了bean的所有必需屬性之後,要調用的回調函數。將在bean生命周期章節中討論。 | |
9 | destruction method |
在包含bean的容器銷毀時要使用的回調函數。將在bean生命周期章節中討論。 |
Spring配置元數據
Spring IoC容器與實際編寫配置元數據的格式完全解耦。以下是向Spring容器提供配置元數據的三種重要方法:
- 基於XML的配置文件。
- 基於註解的配置。
- 基於Java的配置。
您已經看到瞭如何將基於XML的配置元數據提供給容器,但讓我們看一下包含不同bean定義的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-3.0.xsd">
<!-- 一個簡單的bean定義 -->
<bean id = "..." class = "...">
<!-- 此處是該bean的協作者和配置 -->
</bean>
<!-- 啟用延遲初始化的bean定義 -->
<bean id = "..." class = "..." lazy-init = "true">
<!-- 此處是該bean的協作者和配置 -->
</bean>
<!-- 具有初始化方法的bean定義 -->
<bean id = "..." class = "..." init-method = "...">
<!-- 此處是該bean的協作者和配置 -->
</bean>
<!-- 具有銷毀方法的bean定義 -->
<bean id = "..." class = "..." destroy-method = "...">
<!-- 此處是該bean的協作者和配置 -->
</bean>
<!-- 更多的bean定義在此處 -->
Spring中的Bean作用域
在定義<bean>
時,您可以選擇為該bean聲明一個作用域。例如,要強制Spring每次需要時生成新的bean實例,您應該將bean的作用域屬性聲明為prototype。類似地,如果您希望Spring每次需要時返回相同的bean實例,您應該將bean的作用域屬性聲明為singleton。
Spring Framework支持以下五種作用域,其中三種僅在使用與Web相關的ApplicationContext時才可用。
序號 | 作用域 & 描述 |
---|---|
1 | singleton |
將bean定義的作用域限製為Spring IoC容器中的單個實例(預設)。 | |
2 | prototype |
將單個bean定義的作用域限製為具有任意數量的對象實例。 | |
3 | request |
將bean定義的作用域限製為HTTP請求。僅在具有與Web相關的Spring ApplicationContext的情況下有效。 | |
4 | session |
將bean定義的作用域限製為HTTP會話。僅在具有與Web相關的Spring ApplicationContext的情況下有效。 | |
5 | global-session |
將bean定義的作用域限製為全局HTTP會話。僅在具有與Web相關的Spring ApplicationContext的情況下有效。 |
在本章中,我們將討論前兩種作用域,當討論與Web相關的Spring ApplicationContext時,將討論其他三種作用域。
單例作用域(singleton)
如果將作用域設置為singleton,Spring IoC容器將創建一個對象的確切實例,該實例由bean定義定義。此單個實例存儲在此類單例bean的緩存中,對於該命名bean的所有後續請求和引用都會返回緩存的對象。
預設作用域始終是singleton。但是,當您需要一個且僅一個bean實例時,您可以在bean配置文件中將作用域屬性設置為singleton,如下所示:
<!-- 具有singleton作用域的bean定義 -->
<bean id="..." class="..." scope="singleton">
<!-- 此處放置此bean的協作者和配置 -->
示例
假設您已經準備好Eclipse IDE,並採取以下步驟創建Spring應用程式:
步驟 描述 1 創建一個名為SpringExample的項目,在創建的項目中的src文件夾下創建一個名為com.tutorialspoint的包。 2 使用"Add External JARs"選項添加所需的Spring庫,如Spring Hello World示例章節中所述。 3 在com.tutorialspoint包下創建Java類HelloWorld和MainApp。 4 在src文件夾下創建Beans配置文件Beans.xml。 5 最後一步是創建所有Java文件和Bean配置文件的內容,並按以下說明運行應用程式。
以下是HelloWorld.java文件的內容:
package com.tutorialspoint;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Your Message : " + message);
}
}
以下是MainApp.java文件的內容:
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld objA = (HelloWorld) context.getBean("helloWorld");
objA.setMessage("I'm object A");
objA.getMessage();
HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
objB.getMessage();
}
}
以下是singleton作用域所需的Beans.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-3.0.xsd">
<bean id="helloWorld" class="com.tutorialspoint.HelloWorld" scope="singleton">
</bean>
</beans>
當您完成創建源代碼和bean配置文件後,讓我們運行應用程式。如果您的應用程式一切正常,它將列印以下消息:
Your Message : I'm object A
Your Message : I'm object A
原型作用域(prototype)
如果將作用域設置為prototype,Spring IoC容器將在每次請求特定bean時創建該對象的新bean實例。通常,對於所有有狀態的bean,使用prototype作用域,對於無狀態的bean,使用singleton作用域。
要定義原型作用域,您可以在bean配置文件中將作用域屬性設置為prototype,如下所示:
<!-- 具有prototype作用域的bean定義 -->
<bean id="..." class="..." scope="prototype">
<!-- 此處放置此bean的協作者和配置 -->
</bean>
示例
假設您已經準備好Eclipse IDE,並採取以下步驟創建Spring應用程式:
步驟 描述 1 創建一個名為SpringExample的項目,在創建的項目中的src文件夾下創建一個名為com.tutorialspoint的包。 2 使用"Add External JARs"選項添加所需的Spring庫,如Spring Hello World示例章節中所述。 3 在com.tutorialspoint包下創建Java類HelloWorld和MainApp。 4 在src文件夾下創建Beans配置文件Beans.xml。 5 最後一步是創建所有Java文件和Bean配置文件的內容,並按以下說明運行應用程式。
以下是HelloWorld.java文件的內容:
package com.tutorialspoint;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Your Message : " + message);
}
}
以下是MainApp.java文件的內容
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld objA = (HelloWorld) context.getBean("helloWorld");
objA.setMessage("I'm object A");
objA.getMessage();
HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
objB.getMessage();
}
}
以下是prototype作用域所需的Beans.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-3.0.xsd">
<bean id="helloWorld" class="com.tutorialspoint.HelloWorld" scope="prototype">
</bean>
</beans>
當您完成創建源代碼和bean配置文件後,讓我們運行應用程式。如果您的應用程式一切正常,它將列印以下消息:
Your Message : I'm object A
Your Message : null
最後
為了方便其他設備和平臺的小伙伴觀看往期文章,鏈接奉上:
公眾號搜索Let us Coding
,知乎,開源中國,CSDN,思否,掘金,InfoQ,簡書,博客園,慕課,51CTO,helloworld,騰訊開發者社區,阿裡開發者社區
看完如果覺得有幫助,歡迎點贊、收藏和關註