① 怎麼動態改變spring的配置文件applicationContext.xml
既團森櫻然是ssh,那就需要在web.xml中配置一下
用listener
<context-param>塌叢
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/:applicationContext.xml,</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</春隱listener>
② spring如何動態載入配置文件,就是配置文件修改了,application.xml如何能讀取到
項目,需要訪問多個資料庫,而且需要在伺服器運行不重新啟動的情況下,動態的修改spring中配置的數據源datasource,在網上找了很多資料,最後找到了適合我的方法,下面總結一下。
spring的配置文件是在容器啟動的時候就載入到內存中的,如果手動改了application.xml,我們必須要重新啟動伺服器配置文件才會生效。而在spring中提供了一個類WebApplicationContext,這個類可以讓你獲得一些bean,可以修改內存中的信息,我就是通過這個類來實現的。下面是我具體的代碼。
package com.southdigital.hospital;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class ChangeSpringConfig extends HttpServlet
{
private String ipAddress = "127.0.0.1";
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
doPost(request, response);
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
//先取得servleContext對象,提供給spring的WebApplicationUtils來動態修改applicationContext.xml
ipAddress = request.getParameter("ipAddress");
System.out.println(ipAddress);
ServletContext servletContext = this.getServletContext();
WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
ComboPooledDataSource cpds = (ComboPooledDataSource) applicationContext.getBean("dataSource");
cpds.setJdbcUrl("jdbc:mysql://"+ipAddress+":3306/ssh");
}
}
注意:通過這種方法修改applicationContext.xml文件的時候用c3p0,而不可以用dbcp,dbcp不支持動態修改讀取到內存裡面的數據。
spring 3.1已經支持了。
③ 單體Spring boot引入外部配置文件yml,properties
我們在做微服務項目時候會引入spring cloud框架,對於配置文件我們就會通過spring cloud config來配置,實現線上環境動態修改配置文件屬性而不需要重新打jar 包。 但是對於單體的spring boot工程,我們又希望可以在生產環境中方案修改配置文件屬性。
通過引入外部配置文件,應用啟動時候設置配置文件的自動載入
1: 在單體工程的root目錄下添加一個config目錄,然後新建我們的properties, 如:jdbc-db.properties, redis.properties
2: 然後在我們的application啟動類上添加@propertySources註解引入我們的外部文件
注意:因為PropertySources 默認只解析.properties文件,如果要解析yml文件,需要指定factory只需要實現org.springframework.core下的 PropertySourceFactory 介面就OK了。
簡單的properties配置文件只需要按如下方式配置即可
只需要1,2步驟就可以完成外部文件的載入,如果涉及到線上修改配置就只需要手動修改配置文件,重新啟動應用即可生效。
④ Springboot 使用@RefreshScope 註解,實現配置文件的動態載入
實現配置文件動態讀取的好處不必多說,修改配置文件後不必重啟Application ,想想就開心。
合格調包俠的必備技能,從Maven倉庫引入依賴的Jar包,
搞好配置文件,默認在application.yml /properties 就行,與本功能相關的配置項(採用yml格式)如下:
distributed-id是自定義需要動態部署的配置文件。management:是暴露refresh介面,不加此條配置將無法啟用動態載入配置文件的功能(也就是管你理解不理解,別問,加就對了)。
1.編寫自定義配置文件的Java對象,一定要在類上加@RefreshScope註解
@data是lombok的註解,別的註解不多說。
2.編寫你的conroller ,也一定要加@RefreshScope註解, 不加的話,呵呵,對不起,無法運行。。原因嗎---在這 @RefreshScope not working - Spring Boot - Stack Overflow
我這里是返回配置文件中distributed-id.mechineId的值。
3.到此為止了,簡單吧😒。其實的話,第一步也可以直接在Bean的配置中心(也就是@Configuration註解的類)搞一下,效果是一樣的。
使用這種寫法,就可以不用在配置對象類上加@Component和@RefreshScope。
測試一下啦,啟動應用前,將配置文件設置如下:
運行程序後,在瀏覽器輸入你的測試地址,返回如下,是5沒錯了:
然後找到你編譯後文件,修改配置文件的值,注意是 編譯後的配置文件 就是下圖中灰色文件的位置
修改如下:mechineId修改為4
接下來向 http://localhost:port/actuator/refresh 發送 POST 請求,get請求是無法識別的呦😘,可以看到返回了配置文件中被更改的屬性
測試一下,沒錯了,返回值為4
⑤ springboot實現動態載入遠程配置文件
有個獨立的API項目,該項目主要是對外部各個系統提供API介面,為了保證調用的安全,需要對請求進行校驗,主要校驗包括調用頻率,訪問IP,是否跨域和Token,其中IP和是否跨域的配置會根據接入方進行相應的修改,為了避免每次有新的接入方就得去修改一次配置文件並重啟項目,所以打算使用動態配置的方式。
初級實現方案:API服務每隔5分鍾向管理端請求一次數據,管理端添加IP和域白名單的管理,這個實現方案,簡單好用,但是弊端也明顯,管理端每次修改完配置後,客戶端需要等待下次請求後才會載入對應的配置,同時,還需要自己管理獲取到的配置文件
更新方案:在springboot啟動時,先從遠端獲取配置文件,並將其載入進Environment對象中,其餘的,就都交給Spring了。同時配合spring-cloud-context實現遠程配置變更後,本地重新拉取配置並更新
點進去之後,springboot會在這里初始化ConfigurableEnvironment對象
這里是給ConfigurableEnvironment做一些初始化工作,我們先不管了,重點在這里,listeners.environmentPrepared(environment);,Springboot通過事件,將Environment的載入分發出去
到此為止,我們就能像使用本地配置文件一樣使用伺服器上的配置文件了,但是這里還只實現了載入遠程配置文件,我們還需要在遠程配置文件變更時,實現配置文件的熱更新
⑥ Spring的動態代理配置文件怎麼配置
首先配置動態代理的那個類 然後在需要用代理的類 引用配置動態代理的那個對象 就是ref=「配置動態代理的那個對象」
⑦ 怎麼在不重啟服務的情況下修改spring配置文件
我們有個項目要根據不同的注冊用戶,動態為這個用戶生成資料庫。所以就必須在系統中生成新的數據源,吵運這一切都要在不重啟服務的情況下完成。我現在是根據注冊的不同用戶,在spring的配置文件內添加數據源配置,可對spring的配置文件修改後不能得到相應源碰唯的內容。請問怎樣才能重新獲得修改過的配置文件?或者用別的方案來實現?
問題補充:謝謝你的幫助,按照你的雹培方案,問題已經解決。我根據不同的用戶產生相應的配置文件,然後對相應的用戶產生一個ApplicationContext放進Application池進行管理。這樣就是每個用戶都有一個獨立的ApplicationContext。