① 怎么动态改变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。