這篇文章接著上篇的初入繼續往下講,首先我們講一下Spring的Bean,
文章目錄
- Spring Bean
- Spring Bean中的作用域有哪些
- Spring 中的單例 bean 的執行緒安全問題
- @Component 和 @Bean 的區別
- @Bean使用示例
- 將一個類宣告為Spring的 bean 的注解有哪些
- Spring中的Bean生命周期
Spring Bean
Spring Bean中的作用域有哪些
- singleton : 唯一 bean 實體,Spring 中的 bean 默認都是單例的,
- prototype : 每次請求都會創建一個新的 bean 實體,
- request : 每一次HTTP請求都會產生一個新的bean,該bean僅在當前HTTP request內有效,
- session : 每一次HTTP請求都會產生一個新的 bean,該bean僅在當前 HTTP session 內有效,
- global-session: 全域session作用域,僅僅在基于portlet的web應用中才有意義,Spring5已經沒有了,Portlet是能夠生成語意代碼(例如:HTML)片段的小型Java Web插件,它們基于portlet容器,可以像servlet一樣處理HTTP請求,但是,與 servlet 不同,每個 portlet 都有不同的會話
Spring 中的單例 bean 的執行緒安全問題
大部分時候我們并沒有在系統中使用多執行緒,所以很少有人會關注這個問題,單例 bean 存在執行緒問題,主要是因為當多個執行緒操作同一個物件的時候,對這個物件的非靜態成員變數的寫操作會存在執行緒安全問題,
常見的有兩種解決辦法:
1: 在Bean物件中盡量避免定義可變的成員變數(不太現實),
2:在類中定義一個ThreadLocal成員變數,將需要的可變成員變數保存在
ThreadLocal 中(推薦的一種方式),
@Component 和 @Bean 的區別
1:作用物件不同: @Component 注解作用于類,而@Bean注解作用于方法,
2:@Component通常是通過類路徑掃描來自動偵測以及自動裝配到Spring容器中
(我們可以使用 @ComponentScan 注解定義要掃描的路徑從中找出標識了需要裝配
的類自動裝配到 Spring 的 bean 容器中),
@Bean 注解通常是我們在標有該注解的方法中定義產生這個 bean,
@Bean告訴了Spring這是某個類的示例,當我需要用它的時候還給我,
3:@Bean 注解比 Component 注解的自定義性更強,
而且很多地方我們只能通過 @Bean 注解來注冊bean,
比如當我們參考第三方庫中的類需要裝配到 Spring容器時,
則只能通過 @Bean來實作,
@Bean使用示例
@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}
相當于下面的xml配置:
<beans>
<bean id="transferService" class="com.acme.TransferServiceImpl"/>
</beans>
接著下面的這個例子是通過@Component無法實作的
@Bean
public OneService getService(status) {
case (status) {
when 1:
return new serviceImpl1();
when 2:
return new serviceImpl2();
when 3:
return new serviceImpl3();
}
}
將一個類宣告為Spring的 bean 的注解有哪些
我們一般使用 @Autowired 注解自動裝配 bean,要想把類標識成可用于 @Autowired 注解自動裝配的 bean 的類,采用以下注解可實作:
@Component :通用的注解,可標注任意類為 Spring 組件,如果一個Bean不知道屬于哪個層,可以使用@Component 注解標注,
@Repository : 對應持久層即 Dao 層,主要用于資料庫相關操作,
@Service : 對應服務層,主要涉及一些復雜的邏輯,需要用到 Dao層,
@Controller : 對應 Spring MVC 控制層,主要用于接受用戶請求并呼叫 Service 層回傳資料給前端頁面,
Spring中的Bean生命周期
- Bean 容器找到組態檔中 Spring Bean 的定義,
- Bean 容器利用 Java Reflection API 創建一個Bean的實體,
- 如果涉及到一些屬性值 利用 set()方法設定一些屬性值,
- 如果 Bean 實作了 BeanNameAware 介面,呼叫 setBeanName()方法,傳入Bean的名字,
- 如果 Bean 實作了 BeanClassLoaderAware 介面,呼叫 setBeanClassLoader()方法,傳入 ClassLoader物件的實體,
- 與上面的類似,如果實作了其他 *.Aware介面,就呼叫相應的方法,
- 如果有和加載這個 Bean 的 Spring 容器相關的 BeanPostProcessor 物件,執行postProcessBeforeInitialization() 方法
- 如果Bean實作了InitializingBean介面,執行afterPropertiesSet()方法,
- 如果 Bean 在組態檔中的定義包含 init-method 屬性,執行指定的方法,
- 如果有和加載這個 Bean的 Spring 容器相關的 BeanPostProcessor 物件,執行postProcessAfterInitialization() 方法
- 當要銷毀 Bean 的時候,如果 Bean 實作了 DisposableBean 介面,執行 destroy() 方法,
- 當要銷毀 Bean 的時候,如果 Bean 在組態檔中的定義包含 destroy-method 屬性,執行指定的方法,
如圖所示:

和上圖差不多的中文版本如下:

ok,本我就講到這里,基本上Bean的知識點也講的差不多了,Spring的更多知識會在后續的系列文章中展現出來,謝謝大家的觀看,希望能給各位同學帶來幫助,如果覺得博主寫的還可以的,可以點贊關注, 😉
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/227834.html
標籤:java
