您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java之Spring Bean作用域和生命周期源碼分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java之Spring Bean作用域和生命周期源碼分析”吧!
Bean 的作用域是指 Bean 在 Spring 整個框架中的某種行為模式.
比如 singleton 單例作用域, 就表示 Bean 在整個 Spring 中只有一份, 它是全局共享的, 那么當其他人修改了這個值之后, 那么另一個人讀取到的就是被修改的值.
singleton: 單例作用域 (默認作用域)
prototype: 原型作用域 (多例作用域)
request: 請求作用域
session: 回話作用域
application: 全局作用域
websocket: HTTP
# 注意 # 后 4 種狀態是 Spring MVC 中的值,在普通的 Spring 項?中只有前兩種.
Bean 默認情況下是單例狀態(singleton),也就是所有?的使?的都是同?個對象,之前我們學單例模式的時候都知道,使用單例可以很大程度上提高性能,所以在 Spring 中Bean 的作用域默認也是 singleton 單例模式。
描述:該作用域下的 Bean 在 IoC 容器中只存在?個實例:獲取 Bean(即通過 applicationContext.getBean 等方法獲取)及裝配 Bean(即通過 @Autowired 注入)都是同?個對象.
場景:通常無狀態的 Bean 使用該作用域. (無狀態表示 Bean 對象的屬性狀態不需要更新)
描述:每次對該作用域下的 Bean 的請求都會創建新的實例:獲取 Bean(即通過 applicationContext.getBean 等方法獲取)及裝配 Bean(即通過 @Autowired 注入)都是新的對象實例。
場景:通常有狀態的Bean使?該作用域.
描述:每次 http 請求會創建新的 Bean 實例,類似于prototype
場景:?次 http 的請求和響應的共享 Bean
備注:限定 SpringMVC 中使?
描述:在?個 http session 中,定義?個 Bean 實例
場景:?戶回話的共享 Bean , 比如: 記錄?個?戶的登陸信息
備注:限定 SpringMVC 中使?
application (了解)
描述:在?個 http servlet Context 中,定義?個 Bean 實例
場景:Web 應?的上下文信息, 比如:記錄?個應用的共享信息
備注:限定 SpringMVC 中使?
websocket (了解)
描述:在?個 HTTP WebSocket 的?命周期中,定義?個 Bean 實例
場景:WebSocket 的每次會話中,保存了?個 Map 結構的頭信息,將?來包裹客戶端消息頭。第?次初始化后,直到 WebSocket 結束都是同?個 Bean。
備注:限定 Spring WebSocket 中使?
單例作用域 (singleton) VS 全局作用域 (application)
singleton 是 Spring Core 的作用域, application 是 Spring Web 中的作用域.
singleton 作用于 IoC 的容器, application 作用于 Servlet 容器
@Scope 標簽既可以修飾?法也可以修飾類,@Scope 有兩種設置?式
使?枚舉設置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Component public class UserBeans { @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Bean public User user1() { User user = new User(); user.setId(1); user.setName("Gujiu"); user.setPassword("123456"); return user; } }
直接設置值: @Scope("prototype")
@Component public class UserBeans { @Scope("prototype") @Bean public User user1() { User user = new User(); user.setId(1); user.setName("Gujiu"); user.setPassword("123456"); return user; } }
啟動容器 (啟動項目)
讀取配置文件 (初始化)
使用 xml
直接注冊 Bean
配置 Bean
根 (掃描) 路徑
將 Bean 存儲到 Spring
中: 通過類注解進行掃描和裝配
將 Bean
裝配到需要的類中 (取操作)
所謂的?命周期指的是?個對象從誕?到銷毀的整個?命過程,我們把這個過程就叫做?個對象的?命周期。
Bean 的生命周期:
實例化 Bean (對應 JVM 中的 “加載”, 從無到有, 將字節碼轉換成內存中的對象, 只是分配了內存) [買了一套毛坯房]
設置屬性 (Bean 的注入和裝配) [購買裝修材料 (引入外部資源)]
Bean 初始化 [房子裝修]
實現了各種 Aware 通知的方法,如 BeanNameAware、BeanFactoryAware、ApplicationContextAware 的接口方法 [打電話給各個裝修的師傅]
執行 BeanPostProcessor 初始化前置方法 [師傅勘察環境, 指定裝修方案 (前置工作)]
執行 @PostConstruct 初始化方法,依賴注入操作之后被執行 [兩類裝修師傅進行裝修]
執行自己指定的 init-method 方法 (如果有指定的話) [兩類裝修師傅進行裝修]
執行 BeanPostProcessor 初始化后置方法 [裝修之后的清理工作]
使用 Bean [房子可以入住使用了]
銷毀 Bean [賣掉房子]
BeanLifeComponent 類:
//@Component public class BeanLifeComponent implements BeanNameAware { @Override public void setBeanName(String s) { System.out.println("執行了通知"); } @PostConstruct public void postConstruct() { System.out.println("執行了 @PostConstruct"); } public void init() { System.out.println("執行了 init-method"); } @PreDestroy public void preDestroy() { System.out.println("執行了銷毀方法"); } }
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" xmlns:content="http://www.springframework.org/schema/context" 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"> <bean id="myComponent" class="com.demo.component.BeanLifeComponent" init-method="init" ></bean> </beans>
調用類:
public class App2 { public static void main(String[] args) { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml"); BeanLifeComponent beanLifeComponent = applicationContext.getBean("myComponent", BeanLifeComponent.class); System.out.println("使用Bean"); applicationContext.destroy(); } }
運行結果展示:
感謝各位的閱讀,以上就是“Java之Spring Bean作用域和生命周期源碼分析”的內容了,經過本文的學習后,相信大家對Java之Spring Bean作用域和生命周期源碼分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。