高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

JMX(Java Management Extensions,即Java管理擴充套件)是一個為應用程式、裝置、系統等植入管理功能的框架。JMX可以跨越一系列異構作業系統平臺、系統體系結構和網路傳輸協議,靈活的開發無縫整合的系統、網路和服務管理應用。

前面是對JMX的介紹,那麼JMX在我們日常的開發過程中,有什麼實際的意義呢? 相信很多做Java開發的同學都使用過JDK自帶的 jconsole 或者 jvisualvm 監控過JVM的執行情況,但不知道有沒有留意過它們會有一個MBean的功能/標籤,透過MBean可以看到在JVM中執行的元件的一些屬性和操作。下面小編就透過一個SpringBoot應用來一探究竟。並教會你如何自定義擴充套件。

一、SpringBoot中的應用演示

1。 啟動一個SpringBoot應用

下面我們以SpringBoot應用為例子,啟動一個SpringBoot專案。埠是 8080

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

2。 命令列開啟Jconsole

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

3。 連線前面的應用

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

選中MBean標籤,然後可以看到一個SpringApplication的類。shutdown是服務下線。

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

當我們點選了shutdown方法後,應用就會自動的關閉了。導致Jconsole連線丟失。

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

getProperty方法是獲取應用中的配置資訊。如圖我們獲取redis的相關資訊。可以看到返回值是Spring應用中我們定義的值6379

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

那麼其實這個能力就是利用JMX提供的介面來實現的。下面我們透過分析SpringBoot中的原始碼來看它是如何實現的。

二、原始碼追蹤看SpringBoot應用如何實現?

我們透過看Jconsole工具,可以看到工具裡面的類名叫SpringApplication,目錄是admin,於是我們就根據這個推測SpringBoot中的命名,果然我們找到兩個實現類。

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

1. SpringApplicationAdminMXBean

這個類就是JMX中的MBean,我們可以簡單理解這個裡面的方法都是可以透過Jconsole來呼叫的。透過將這個類註冊給JMX管理器就能實現在Jconsole中的資料展示。

首先看

SpringApplicationAdminMXBean

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

實現類

SpringApplicationAdmin

,是SpringApplicationAdminMXBeanRegistrar的內部類

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

2. SpringApplicationAdminMXBeanRegistrar

提供註冊能力。這個類中我們可以知道如何註冊JMX以及如何取消註冊。下面我看這個類如何利用Spring提供的介面能力,來實現應用下線。及註冊到JMX上的吧。

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

自動化配置將SpringApplicationAdminMXBeanRegistrar宣告成一個Spring中的Bean物件。並配置JMX中的命名及目錄。

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

1. ApplicationContextAware

獲得讀取上下文能力。在Spring容器中一個bean如何實現了該方法則就可以獲取上下文物件。

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

2. GenericApplicationListener

獲取處理事件的能力,同樣在Spring中只要實現該介面,就獲取了事件監聽的能力,不過具體監聽什麼事件要自己去判斷。大家可以根據例子來理解。

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

3. EnvironmentAware

獲取應用配置資訊, 和上面一樣實現了Aware結尾的介面,都能獲取物件的Spring內容的物件例項,然後我們就可以根據該例項,來進行功能擴充套件。

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

4. InitializingBean

這裡就要著重看了,在初始化時候將MBean註冊到JMX上。當然我們可以透過 @PostConstruct註解來宣告初始化方法。

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

5. DisposableBean

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

透過對SpringBoot應用原始碼的追蹤,我們大概已經明白JMX的實際意義了,並且能自定義一個能提供類似能力的MBean了吧,但是JMX能做的遠遠不止如此。

三、自定義MBean

注意介面名必須是MBean結尾,實現類必須去掉MBean;如CustomMBean介面對應的實現類必須是Custom。

1. 程式碼實現

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

2. 演示

高階Java程式設計師知道的JMX擴充套件,SpringBoot中也有使用的知識點?

四、總結

透過前面的演示,大概我們對JMX在實際中的用處有一個大概的瞭解了吧。根據這個特性,我們就可以根據我們的需求來定製屬於自己的能力。

最後求關注,求訂閱,謝謝你的閱讀!