1. 程式人生 > >springboot裝配devtools後,類被載入兩次的問題

springboot裝配devtools後,類被載入兩次的問題

場景:

    專案採用springboot+devtools熱載入開發,在專案的某個角落有一個工具類,採用靜態內部類做InstanceHolder,如下:

public final class ConnectionTool {
    private ConnectionTool() {}

public static final ConnectionTool getInstance() {
return MyHolder.getInstance();
}

public final class MyHolder {
private MyHolder() {}

private static final Object SYNC_OBJ = new Object();

private static ConnectionTool instance;

public static ConnectionTool getInstance() {
final ConnectionTool pool;
synchronized(SYNC_OBJ) {
if(instance == null) {
instance = new ConnectionTool();
}
pool = instance;
}
return pool;
}
}
}

在實際呼叫的時候,有兩個地方,一個是controller中獲取instance,另一個是schedule方法中獲取instance。但是兩個地方獲取到的instance竟然不是同一個,換言之,本以為萬無一失的單例終極之道竟然失效。。。憂傷

經過重重篩查,最終發現,兩個地方的類的ClassLoader竟然不是同一個,controller中的classCloader是[email protected],而執行緒中的是org.sprin[email protected]68801664,換言之,這個類被載入了兩次,so。

解決方案:

1. 去掉devtools,問題不攻自破

2.  用系統類載入器+反射來獲取instance,如下:

try {
	ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
	Class<?> aClass = systemClassLoader.loadClass("com.a.b.c.ConnectionPool");
	Method getInstance = MethodUtils.getMatchingMethod(aClass, "getInstance");
	ConnectionPool invoke = (ConnectionPool)getInstance.invoke(null);
	System.out.println(aClass);
	System.out.println(aClass.getClassLoader());
}catch (Exception e) {
	e.printStackTrace();
}
from now on, everything will be ok, good lucks!

相關推薦

springboot裝配devtools載入的問題

場景:    專案採用springboot+devtools熱載入開發,在專案的某個角落有一個工具類,採用靜態內部類做InstanceHolder,如下:public final class ConnectionTool {     private ConnectionToo

tomcat下的一個載入

tomcat部署的專案,有個類執行了兩次,剛好是定時任務,這是非常嚴重的! 解決辦法: 在部署專案的時候配置檔案server.xml的host內容配置如下: tomcat 對一個 web 應用會有一個類載入器,在Host的appBase=“webapps“裡面配置了專案的路

spring-servlet.xml 和 application.xml 配置含義及bean載入的問題

最近在遷移一個專案,原本是RPC服務與API水平拆分的,現在需要垂直拆分,每個RPC服務自己提供http介面,我負責遷移RPC部分,另一個同事負責遷移API部分,涉及到一些配置遷移的時候出現了些小狀

MyEclipse更改專案名導致Spring載入

下午遇到一個很CaoDan的問題。在myeclipse2015中改了一個專案的名稱,結果在啟動的時候,Spring框架一直初始化兩次。列印如下: Initializing Spring root WebApplicationContext ...... Initializi

當一個載入它的靜態變數生命週期是什麼是整個應用程式執行結束(比如java web程式載入到伺服器關閉還是該執行緒執行完畢)還是別的什麼?

靜態變數在記憶體中只有一個,JAVA虛擬機器載入類的時候為其分配記憶體,位於方法區,被類的所有例項共享,其生命週期取決於類的生命週期。。。當類被解除安裝。。。靜態變數也被銷燬 取決於類載入器。如果換了一個類載入器,這個

static{}(即static塊)會在載入的時候執行且僅會執行一一般用來初始化靜態變數和呼叫靜態方法

這裡是一個工具類,因為連線配置資訊只需要執行一次就行所以採用static塊 static塊會最先執行 package com.my.jedis; import java.io.IOException; import java.io.InputStream; import

為什麽用new 創建的對象不能夠delete即使這個對象所屬的並不含指針?

vra 記載 www. blank asm mgo dbi lbs t420 h迷C剿刪斷28幼g匚28收http://jz.docin.com/nwo027 吩D913憑瞥5褂ND職昧耙http://www.docin.com/app/user/userinfo?use

SpringBoot使用devtools導致的型轉換異常

libs boot ont hat create 自己 res tar art 遇到的問題:SpringBoot項目中的熱部署引發的血的教訓,報錯代碼位置: 1 XStream xStream1 = new XStream(); 2 xStream1.autodete

php 介面安全檢查--防止url連結或者介面地址暴露網站惡意攻擊

網站安全問題: 1.Session檢查防止攻擊: function checkusersession(){     $sid = cookie('sid');     if($sid === null)    &

使用springboot 2.0靜態資源預設路徑無法訪問

原因在於:META-INF/resources / resources / static / public 都是spring boot 認為靜態資源應該放置的位置,會自動去尋找靜態資源 然而,在2.0之後 就發生了變化。   需要新增如下的配置 @Configurable publi

Java子繼承父載入順序看著一篇就夠了

1. 程式碼 package parent; public class Child extends Father { static { System.out.println("

詐騙2.46萬元報警告知追回損失的可能性極小

再次把我2018年10月21日沉痛的被詐騙經歷暴露給大家,可能會被大家嘲笑我愚蠢,但是我還是希望我的經歷能幫助更多人能不被騙,也希望能號召所有經歷過類似被詐騙的經歷的大家一起團結起來,協助公安機關破案,打擊罪犯~ 2018年10月21日上午9點半左右,我收到一個“高中同學”(騙子,真實該同學qq號被

JVM中 一個只會載入

     載入是相對於程序而言的,     啟動一個main方法,也就是啟動了一個程序,在一個程序中,一個類只會被載入一次public class TestThread { /**

當一個載入時成員的初始化順序

        當一個類因為例項化被載入時,其成員的初始化順序是什麼呢?          先看下面這段程式碼: class Fsx{ public Fsx(){ System.out.println("Fsx無參構造器初始化了"); } public Fsx(

Spring的定時任務@Scheduled部署執行載入

最近公司讓做定時抓取新聞的一個定時,一切都部署好後,發現每次都載入了兩次。配置檔案都檢查了,也沒發現問題。 1.註解的配置 <!-- 啟用註解定時 --> <task:annotation-driven scheduler="mySchedul

JVM中 一個只會載入

     載入是相對於程序而言的,      啟動一個main方法,也就是啟動了一個程序,在一個程序中,一個類只會被載入一次 public class TestThread { /** * 啟

Java的靜態程式碼塊是否會在載入時自動執行?

JAVA靜態程式碼塊會在類被載入時自動執行? 一、先看Java靜態方法,靜態變數 靜態程式碼塊 在類中,可以將某一塊程式碼宣告為靜態的,這樣的程式塊叫靜態初始化段。靜態程式碼塊的一般形式如下: static { 語句序列 } public class staticBlock{

遠端oracle使用者輸入多錯誤密碼使用者鎖定

以linux下的作業系統為例 1.登入遠端伺服器 2. 登入到Linux後,就可以在命令視窗直接對Linux進行操作了。 這裡我們先將使用者切換到Oracle。當顯示為[[email protected] ~]$ 時,說明切換成功。 命令:su - ora

糊糊的前端學習筆記——a標籤點選跳轉頁面點選的a標籤新增樣式【Day1】

本人前端小白一枚,初步接觸前端知識一個月。從今天開始將在部落格上分享一下我每日工作中遇到的一些問題和相應的解決,以幫助自己更好的學習和成長。 今天在製作網頁頂部公共導航時,遇到這樣一個問題,我需要在a標籤點選跳轉頁面後,為被點選的a標籤新增樣式。 增添樣式如下:.selec

雙親委派模型載入機制搞定大廠高頻面試題

看過這篇文章,大廠面試你「雙親委派模型」,硬氣的說一句,你怕啥? 讀該文章姿勢 開啟手頭的 IDE,按照文章內容及思路進行程