目錄
前言:
Bean的作用域(Scope)
單例模式
原型模式(多例作用域)
請求作用域(request)
會話作用域
全局作用域
網(wǎng)絡長連接
Spring執(zhí)行流程
Bean的生命周期
測試
小結(jié):
前言:
? ? 使用Spring框架時,我們需要清楚Spring托管Bean的作用域和生命周期,這樣使用框架才會更加得心應手。
Bean的作用域(Scope)
單例模式
? ? singleton(默認模式),出于性能考慮,單例模式只需要實例一次即可(淺拷貝)。每次使用的都是同一個對象。
? ? 該作用域的下的Bean在IoC容器中只存在一個實例。獲取Bean,通過applicationContext.getBean()等方法獲取,或者使用注解裝配Bean(@Autowired注入)都是同一個對象實例。
? ? 通常無狀態(tài)的Bean使用該模式(無狀態(tài)表示Bean對象的屬性不需要更新)。Spring默認使用該模式。
原型模式(多例作用域)
? ? prototype(多例模式),每次使用對象都需要創(chuàng)建Bean對象,互相都沒關(guān)系(深拷貝)。
? ? 每次該作用域下的請求Bean對象實例都會創(chuàng)建新的Bean,類似于多例模式。獲取Bean,通過applicationContext.getBean()等方法獲取,或者使用注解裝配Bean(@Autowired注入)都是新的對象實例。
? ? 通常有狀態(tài)的Bean使用該作用域,Bean的屬性可能會更新。
請求作用域(request)
? ? 每次HTTP請求,都會創(chuàng)建一個Bean對象(適用于 Spring MVC),類似于prototype模式。
? ? 一次HTTP請求和響應是共享同一個Bean對象實例。
會話作用域
? ? 每次Session會話共享一個Bean,例如記錄用戶的登錄信息(適用于 Spring MVC)。在一個 http session 中,定義一個Bean實例。
全局作用域
? ? application,一個http servlet context 中共享同一個Bean(適用于 Spring MVC)。
? ? 在一個http servlet context 中,定義一個Bean對象實例。Web應用的上下文信息,例如記錄一個應用的共享信息。
網(wǎng)絡長連接
? ? WebSocket,只適用于Spring?WebSocket。在一個HTTP?WebSocket的生命周期中(一次長連接),定義一個Bean實例。
? ? WebSocket的每次會話中,保存了一個Map結(jié)構(gòu)的頭信息,用來保存客戶端消息頭。第一次初始化后,直到一次長連接結(jié)束都是用一個Bean。
注意:
? ? 可以在Spring配置文件中使用scpoe屬性設置相應Bean的作用域。
Spring執(zhí)行流程
? ? 1)啟動容器。加載配置文件,spring-config.xml文件。
? ? 2)根據(jù)配置完成Bean實例化,初始化(分配內(nèi)存空間,從無到有,初始化空間)。掃描配置文件下帶有五大類或者方法注解,進行Bean初始化。
? ? 3)注冊Bean到Spring容器中。
? ? 4)注入Bean的屬性。(@Autowired,@Resource)。
Bean的生命周期
? ? 宏觀上來談,Bean的生命周期就是從誕生到銷毀的過程。
1)開辟內(nèi)存空間(實例化)
2)設置屬性(注入屬性)
3)初始化
- 各種通知(對象的哪個屬性初始化完成了)
- 初始化前置方法
- 初始化方法(兩種實現(xiàn)方式:xml方式,注解方式)
- ?初始化后置方法
4)使用Bean
5)銷毀Bean對象
注意:
? ??設置屬性必須在初始化之前,因為有可能在初始化的時候使用Bean。
測試
package com.spring.demo.component;
import org.springframework.beans.factory.BeanNameAware;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class BeanComponent implements BeanNameAware {
@Override
public void setBeanName(String s) {
System.out.println("執(zhí)行了通知 -> " + s);
}
// xml初始化
public void myInit() {
System.out.println("xml方式初始化");
}
@PostConstruct
public void doPostConstruct() {
System.out.println("注解初始化");
}
public void hello() {
System.out.println("hello");
}
@PreDestroy
public void doPreDestroy() {
System.out.println("執(zhí)行了 doPreDestroy");
}
}
? ? Spring配置文件,將Bean手動存儲在Spring容器中。
<bean id="beanComponent" class="com.spring.demo.component.BeanComponent" init-method="myInit"></bean>
運行結(jié)果
注意:
? ? 可以清楚看見Bean生命周期所做的一些事情(這里使用了兩種初始化的方式)。文章來源:http://www.zghlxwxcb.cn/news/detail-438029.html
小結(jié):
? ? Spring手動添加Bean和通過getBean()獲取Bean的方式太麻煩,因此有了Spring Boot,就是Spring腳手架。目的就是更加方便的使用Spring容器,后續(xù)文章會詳細介紹。文章來源地址http://www.zghlxwxcb.cn/news/detail-438029.html
到了這里,關(guān)于Spring Bean的作用域及生命周期的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!