日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java spring 单例模式,spring中的单例模式

發布時間:2023/12/4 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java spring 单例模式,spring中的单例模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

spring依賴注入的bean默認都是單例模式,他們是怎么創建的?

在AbstractBeanFactory類中的getBean方法中調用了getSingleton()方法來創建bean:

@Nullable

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;

}

spring依賴注入時,使用了雙重判斷加鎖的單例模式,首先從緩存MAP中獲取bean實例,如果為null,對緩存map加鎖,然后再從緩存中獲取bean,如果繼續為null,就創建一個bean。

Spring并沒有使用私有構造方法來創建bean,而是通過singletonFactory.getObject()返回具體beanName對應的ObjectFactory來創建bean。實際上是調用了AbstractAutowireCapableBeanFactory的doCreateBean方法,返回了BeanWrapper包裝并創建的bean實例。

看一下Netty實現的單例模式

public final class ReadTimeoutException extends TimeoutException {

private static final long serialVersionUID = 169287984113283421L;

public static final ReadTimeoutException INSTANCE = new ReadTimeoutException();

private ReadTimeoutException() { }

}

類的定義十分簡單,包含一個私有的構造函數和一個static final 實例 :這樣其他的調用者如果想獲取一個這個類的對象的話,訪問不到私有的構造函數,而只能通過instance拿到對象。

使用static final的好處是:當類被調用的時候,static final會初始化,JNI會給這個類添加一個同步塊,保證并發安全。

另外這種方式只有當類被調用的時候才會初始化一個實例。

總結

以上是生活随笔為你收集整理的java spring 单例模式,spring中的单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。