在開發過程常常有同窗問:「我這個配置更新提交了,怎麼樣知道項目中是否已經更新使用新值?」 經常使用的方法是添加日誌打印該值判斷是否更新。今天咱們用Arthas來實現項目中配置值實時讀取。html
Arthas 是Alibaba開源的Java診斷工具。使用 Arthas 能夠很方便幫助咱們排查線上問題。下面簡單介紹幾個經常使用的命令以及使用的場景。前端
上面的命令是做爲開發常常使用到的,具體怎麼樣使用Arthas請看官網。java
假設你們都知道 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,而後作大家想作的事。