Arthas查看Spring配置

在開發過程常常有同窗問:「我這個配置更新提交了,怎麼樣知道項目中是否已經更新使用新值?」 經常使用的方法是添加日誌打印該值判斷是否更新。今天咱們用Arthas來實現項目中配置值實時讀取。html

Arthas 簡介

Arthas 是Alibaba開源的Java診斷工具。使用 Arthas 能夠很方便幫助咱們排查線上問題。下面簡單介紹幾個經常使用的命令以及使用的場景。前端

  • jad 命令反編譯指定已加載類的源碼。在代碼修改了不生效,懷疑代碼沒有部署時能夠經過該命令查看源碼。
  • thread 命令查看當前線程信息,線程的堆棧。線程池線程爆滿時用該命令查看阻塞線程;CPU使用率太高用該命令查看佔用CPU最高的線程。
  • jvm 命令查看當前JVM信息。查看使用什麼垃圾回收算法、線程數和阻塞線程數等。
  • watch 命令方法執行數據觀測。觀察方法入參和返回值,或者報錯信息等。
  • trace 命令方法內部調用路徑,並輸出方法路徑上的每一個節點上耗時。查看方法內部調用全部的接口和每一個接口對應的耗時,這個能夠很好的掌控接口性能質量。
  • tt 命令記錄下指定方法每次調用的入參和返回信息,並能對這些不一樣的時間下調用進行觀測。須要重現某個問題時,須要前端同窗配合點擊,用這個命令能夠代替前端同窗,回放以前的請求。
  • getstatic 命令能夠查看類的靜態屬性。
  • ognl 命令能夠查看類的靜態屬性,而且能夠作不少不能夠描述的事情!

上面的命令是做爲開發常常使用到的,具體怎麼樣使用Arthas請看官網。java

OGNL竊取SpringContext屬性

假設你們都知道 SpringBoot 讀取配置以後存在 ConfigurableApplicationContext 的 environment 中。若是有不知道的,能夠在 PropertySourceBootstrapConfiguration#initialize 方法裏打個斷點debug調試一波😏。下面用一個例子操做一波。git

步驟一

application.properties文件中添加 author=Greiz 鍵值對。github

步驟二

想辦法拿到項目中 ApplicationContext 對象。ognl只獲取靜態屬性,因此咱們通常須要查找項目中是否存在靜態的ApplicationContext對象。這裏面我就本身建立了一個類來提供靜態的ApplicationContext。算法

package com.greiz.demo.config;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class ConfigHandler implements InitializingBean, ApplicationContextAware {
    private static ApplicationContext applicationContext;
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println(applicationContext.getEnvironment().getProperty("author"));
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ConfigHandler.applicationContext = applicationContext;
    }
}

這種方式是否是處處可見。若是用Dubbo的,Dubbo框架裏com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory 持有靜態的 ApplicationContext 對象。spring

步驟三

使用ognl獲取靜態 ApplicationContext 屬性。app

ognl '#context=@com.greiz.demo.config.ConfigHandler@applicationContext,#context.getEnvironment().getProperty("author")'

逗號以前是獲取 ApplicationContext 對象並賦值給 context。逗號後面的獲取 Environment 對象中的屬性。這個 "author" 屬性就是application.properties 配置的,也能夠是遠程的配置文件。框架

對應的結果jvm

其實只要獲取到ApplicationContext 對象,咱們就能夠對Spring容器隨心所欲了,好比下面不知恥辱的行爲:

@Component
public class Greiz {

    @Value("${userName}")
    private String name;
    @Value("${userAge}")
    private Integer age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}

能夠獲取Spring容器的全部bean,而後調用對應的方法。

總結

熟悉Arthas 工具經常使用命令;瞭解配置最終所保存的對象;提供靜態屬性的 ApplicationContext 對象;ognl獲取Spring容器鑰匙ApplicationContext,而後作大家想作的事。

相關文章
相關標籤/搜索