欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java之SSM中bean相關(guān)知識(shí)匯總案例講解

 更新時(shí)間:2021年07月27日 11:31:56   作者:qianye_97  
這篇文章主要介紹了Java之SSM中bean相關(guān)知識(shí)匯總案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

bean 的生命周期

在這里插入圖片描述

對(duì)象創(chuàng)建

  1. 實(shí)例化Bean對(duì)象,默認(rèn)選擇無(wú)參構(gòu)造方法,如果只有一個(gè)有參構(gòu)造那么調(diào)用有參構(gòu)造,如果只有多個(gè)有參構(gòu)造那么報(bào)錯(cuò),除非其中一個(gè)有參構(gòu)造添加了@AutoWired注解;
  2. 設(shè)置Bean的屬性;
  3. 依賴注入以及判斷是否實(shí)現(xiàn)了Aware相關(guān)接口(BeanNameAware, BeanFactoryAware, ApplicationContextAware)
  4. 如果這個(gè) Bean 關(guān)聯(lián)了 BeanPostProcessor 接口,將會(huì)調(diào)用BeanPostProcessor.postProcessorBeforeInitialization()
  5. 判斷是否實(shí)現(xiàn)了InitalizingBean接口,實(shí)現(xiàn)了就執(zhí)行 InitalizingBean.afterPropertiesSet() 方法
  6. 如果Bean在配置文件中的定義包含init-method屬性(或者添加了@PostConstruct注解),執(zhí)行指定的方法;
  7. 執(zhí)行方法BeanPostProcessor.postProcessorAfterInitialization():例如判斷有沒(méi)有實(shí)現(xiàn)AOP
  8. 創(chuàng)建對(duì)象完畢;

對(duì)象銷毀

  1. 當(dāng)要銷毀Bean的時(shí)候,如果Bean實(shí)現(xiàn)了DisposableBean接口,執(zhí)行destroy()方法。
  2. 當(dāng)要銷毀Bean的時(shí)候,如果Bean在配置文件中的定義包含destroy-method屬性(或者添加了@PreDestroy注解),執(zhí)行指定的方法
  3. 銷毀對(duì)象完畢

Bean 的作用域

spring 支持 5 種作用域,如下:

request:每一次HTTP請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的bean,該bean僅在當(dāng)前HTTP request內(nèi)有效。

  • singleton::?jiǎn)卫J?,Spring IoC 容器中只會(huì)存在一個(gè)共享的 Bean 實(shí)例,無(wú)論有多少個(gè)Bean 引用它,始終指向同一對(duì)象。該模式在多線程下是不安全的。Singleton 作用域是Spring 中的默認(rèn)作用域
  • prototype:每次通過(guò) Spring 容器獲取 prototype 定義的 bean 時(shí),容器都將創(chuàng)建一個(gè)新的 Bean 實(shí)例,每個(gè) Bean 實(shí)例都有自己的屬性和狀態(tài),而 singleton 全局只有一個(gè)對(duì)象。根據(jù)經(jīng)驗(yàn),對(duì)有狀態(tài)的bean使用prototype作用域,而對(duì)無(wú)狀態(tài)的bean使用singleton作用域。
    • 用于與數(shù)據(jù)庫(kù)交互的存儲(chǔ)數(shù)據(jù)的bean等,均是有狀態(tài)的bean。
    • 而僅僅用于操作其他資源的bean,如service controller,就是無(wú)狀態(tài)的bean。
    • 當(dāng)然,由于spring使用了ThreadLocal進(jìn)行多線程處理,絕大多數(shù)bean都可以聲明為singleton作用域。這是后話。
  • session:在一次 Http Session 中,容器會(huì)返回該 Bean 的同一實(shí)例。而對(duì)不同的 Session 請(qǐng)求則會(huì)創(chuàng)建新的實(shí)例,該 bean 實(shí)例僅在當(dāng)前 Session 內(nèi)有效。同 Http 請(qǐng)求相同,每一次session 請(qǐng)求創(chuàng)建新的實(shí)例,而不同的實(shí)例之間不共享屬性,且實(shí)例僅在自己的 session 請(qǐng)求內(nèi)有效,請(qǐng)求結(jié)束,則實(shí)例將被銷毀。如用戶購(gòu)物車
  • global-session:全局session作用域,僅僅在基于Portlet的Web應(yīng)用中才有意義,Spring5中已經(jīng)沒(méi)有了。Portlet是能夠生成語(yǔ)義代碼(例如HTML)片段的小型Java Web插件。它們基于Portlet容器,可以像Servlet一樣處理HTTP請(qǐng)求。但是與Servlet不同,每個(gè)Portlet都有不同的會(huì)話。

bean的循環(huán)依賴

什么是循環(huán)依賴

一個(gè)AService里面引用了BService的一個(gè)對(duì)象,BService里面又引用了AService的一個(gè)對(duì)象。

那么在構(gòu)造AService的bean的時(shí)候,會(huì)填充屬性以及注入依賴,那么就需要注入BService的bean,spring發(fā)現(xiàn)BService的bean還沒(méi)有創(chuàng)建,又會(huì)去構(gòu)造BService的bean。同理BService的bean又需要AService的bean,這時(shí)候因?yàn)锳Service的bean還沒(méi)有構(gòu)建好,所以他也會(huì)去創(chuàng)建AService的bean。一直循環(huán)

在這里插入圖片描述

怎么解決:使用二級(jí)緩存

  • singletonObjects:第一級(jí)緩存,里面放置的是實(shí)例化好的單例對(duì)象;這個(gè)是一直存在的
  • earlySingletonObjects:第二級(jí)緩存,里面存放的是提前曝光的單例對(duì)象;就是下面圖中的那個(gè)緩存

在這里插入圖片描述

有什么問(wèn)題

如果上述的bean不存在AOP,那么是沒(méi)有什么問(wèn)題的,但是如果存在AOP的話,那么構(gòu)造出來(lái)的bean對(duì)象就不是原始對(duì)象了,而是AOP生成的代理對(duì)象。如果還是使用二級(jí)緩存的話,那么B從緩存取的是A的原始對(duì)象而不是構(gòu)造好的A的bean對(duì)象

怎么解決

添加一層緩存,singletonFactories:第三級(jí)緩存,里面存放的是要被實(shí)例化的對(duì)象的對(duì)象工廠。

主要代碼如下:

protected Object getSingleton(String beanName, boolean allowEarlyReference) {
    Object singletonObject = this.singletonObjects.get(beanName);
    if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
        synchronized (this.singletonObjects) {
            singletonObject = this.earlySingletonObjects.get(beanName);
            if (singletonObject == null && allowEarlyReference) {
                ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                if (singletonFactory != null) {
                    singletonObject = singletonFactory.getObject();
                    this.earlySingletonObjects.put(beanName, singletonObject);
                    this.singletonFactories.remove(beanName);
                }
            }
        }
    }
    return (singletonObject != NULL_OBJECT ? singletonObject : null);
}

分析getSingleton()的整個(gè)過(guò)程,Spring首先從一級(jí)緩存singletonObjects中獲取。如果獲取不到,并且對(duì)象正在創(chuàng)建中,就再?gòu)亩?jí)緩存earlySingletonObjects中獲取。如果還是獲取不到且允許singletonFactories通過(guò)getObject()獲取,就從三級(jí)緩存singletonFactory.getObject()(三級(jí)緩存)獲取,如果獲取到了則從singletonFactories中移除,并放入earlySingletonObjects中。其實(shí)也就是從三級(jí)緩存移動(dòng)到了二級(jí)緩存。

總結(jié)一下流程:

  • A在第一步實(shí)例化對(duì)象之后將自己提前曝光到singletonFactories中
  • 在填充屬性時(shí)發(fā)現(xiàn)自己依賴對(duì)象B,此時(shí)就嘗試去get(B),發(fā)現(xiàn)B還沒(méi)有被create,所以走create流程
  • B在填充屬性的時(shí)候發(fā)現(xiàn)自己依賴了對(duì)象A,于是嘗試get(A),嘗試一級(jí)緩存singletonObjects(肯定沒(méi)有,因?yàn)锳的bean還沒(méi)有構(gòu)造完),嘗試二級(jí)緩存earlySingletonObjects(也沒(méi)有),嘗試三級(jí)緩存singletonFactories,由于A通過(guò)ObjectFactory將自己提前曝光了,所以B能夠通過(guò)ObjectFactory.getObject拿到A對(duì)象
  • 通過(guò)提前引用,直接創(chuàng)建出A的動(dòng)態(tài)代理對(duì)象也就是實(shí)例化好的A的bean放到第二個(gè)緩存中,這樣B的bean就直接實(shí)例化完成進(jìn)入一級(jí)緩存。
  • 此時(shí)回調(diào)到A中,A填充屬性這一步完成了繼續(xù)往下執(zhí)行,因?yàn)閎ean是單例的,所以A不會(huì)又去調(diào)用動(dòng)態(tài)代理再創(chuàng)建一個(gè)bean,而是直接從第二個(gè)緩存里拿出實(shí)例化好的那個(gè)bean出來(lái)直接用放進(jìn)一級(jí)緩存中。

到此這篇關(guān)于Java之SSM中bean相關(guān)知識(shí)匯總案例講解的文章就介紹到這了,更多相關(guān)Java之SSM中bean相關(guān)知識(shí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解MyBatis中column屬性的總結(jié)

    詳解MyBatis中column屬性的總結(jié)

    在MyBatis的映射中有column這么一個(gè)屬性,我一直以為它映射的是數(shù)據(jù)庫(kù)表中的列名,但經(jīng)過(guò)學(xué)習(xí)發(fā)現(xiàn)他似乎映射的是SQL語(yǔ)句中的列名,或者說(shuō)是查詢結(jié)果所得到的表的列名,這篇文章主要介紹了MyBatis中column屬性的總結(jié),需要的朋友可以參考下
    2022-09-09
  • java實(shí)現(xiàn)AES可逆加密算法

    java實(shí)現(xiàn)AES可逆加密算法

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)AES可逆加密算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Springboot整合logback多節(jié)點(diǎn)日志文件加端口號(hào)區(qū)分的操作方法

    Springboot整合logback多節(jié)點(diǎn)日志文件加端口號(hào)區(qū)分的操作方法

    這篇文章主要介紹了Springboot整合logback多節(jié)點(diǎn)日志文件加端口號(hào)區(qū)分的操作方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • JavaWeb亂碼問(wèn)題的終極解決方案(推薦)

    JavaWeb亂碼問(wèn)題的終極解決方案(推薦)

    這篇文章主要給大家介紹了關(guān)于JavaWeb亂碼問(wèn)題的終極解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JavaWeb具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • maven中更改jdk版本的方法實(shí)現(xiàn)

    maven中更改jdk版本的方法實(shí)現(xiàn)

    本文主要介紹了maven中更改jdk版本的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • Spring配置多個(gè)數(shù)據(jù)源并實(shí)現(xiàn)數(shù)據(jù)源的動(dòng)態(tài)切換功能

    Spring配置多個(gè)數(shù)據(jù)源并實(shí)現(xiàn)數(shù)據(jù)源的動(dòng)態(tài)切換功能

    這篇文章主要介紹了Spring配置多個(gè)數(shù)據(jù)源并實(shí)現(xiàn)數(shù)據(jù)源的動(dòng)態(tài)切換功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • Spring Boot如何優(yōu)雅的使用多線程實(shí)例詳解

    Spring Boot如何優(yōu)雅的使用多線程實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot如何優(yōu)雅的使用多線程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • SpringBoot war包部署到Tomcat服務(wù)器

    SpringBoot war包部署到Tomcat服務(wù)器

    這篇文章主要介紹了SpringBoot war包部署到Tomcat服務(wù)器,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • java如何保證多個(gè)線程按一定順序執(zhí)行

    java如何保證多個(gè)線程按一定順序執(zhí)行

    這篇文章主要介紹了java如何保證多個(gè)線程按一定順序執(zhí)行問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • SpringBoot整合RabbitMQ處理死信隊(duì)列和延遲隊(duì)列

    SpringBoot整合RabbitMQ處理死信隊(duì)列和延遲隊(duì)列

    這篇文章將通過(guò)示例為大家詳細(xì)介紹SpringBoot整合RabbitMQ時(shí)如何處理死信隊(duì)列和延遲隊(duì)列,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-05-05

最新評(píng)論