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