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中的单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对称双扬声回归!小米12高清渲染图曝光:
- 下一篇: java如何解压rar文件怎么打开,ja