Ⅰ SpringBoot 配置文件详解(告别XML)
快速学会和掌握 SpringBoot 的 核心配置文件的使用。
SpringBoot 提供了丰富的 外部配置 ,常见的有:
其中核心配置文件我们并不陌生,主要以Key-Value的形式进行配置,其中属性Key主要分为两种:
在 application.properties 添加配置如下:
① 添加数据源信息
在 application.propertis 添加配置如下:
① 添加认证信息,其中 socks.indentity.* 是自定义的属性前缀。
② 添加随机值,其中spring.test.* 是自定义的属性前缀。
使用方法: @ConfigurationProperties(prefix = “spring.datasource”)
使用说明:提供 Setter方法 和 标记组件 Component
如何验证是否成功读取配置?答:这里可以简单做个验证,注入 MyDataSource ,使用 Debug 模式可以看到如下信息:
使用方法: @Value(“spring.datasource.*”)
使用说明:提供 Setter方法 和 标记组件 Component
注意事项:@Value不支持注入静态变量,可间接通过Setter注入来实现。
关于两者的简单功能对比:
显然,前者支持松绑定的特性更强大,所以在实际开发中建议使用@ConfigurationProperties来读取自定义属性。
SpringBoot 默认会加载这些路径加载核心配置文件,按优先级从高到低进行排列:具体规则详见 ConfigFileApplicationListener
如果存在多个配置文件,则严格按照优先级进行覆盖,最高者胜出:
举个简单的例子,例如再上述位置都有一个application.properties ,并且每个文件都写入了server.port=xx (xx分别是9001,9002,9003,9004),在启动成功之后,最终应用的端口为:9004。图例:
如果想修改默认的加载路径 或者 调改默认的配置文件名,我们可以借助命令行参数进行指定,例如:
YAML是jsON的一个超集,是一种可轻松定义层次结构的数据格式。
答: 因为配置文件这东西,结构化越早接触越规范越好。这里推荐阅读阮一峰老师写的 YAML语言教程 ,写的很简单明了。
引入依赖: 在POM文件引入 snakeyaml 的依赖。
使用说明: 直接在类路径添加 application.yml 即可。
例如下面这两段配置是完全等价的:
① 在 application.yml 配置数据源:
② 在 application.properties 配置数据源:
在项目的实际开发中,我们往往需要根据不同的环境来加载不同的配置文件。例如生产环境,测试环境和开发环境等。此时,我们可以借助 Profiles 来指定加载哪些配置文件。例如:
温馨提示:如果spring.profiles.active指定了多个配置文件,则按顺序加载,其中最后的优先级最高,也就是最后的会覆盖前者。
使用方法: 使用Maven插件打包好项目,然后在当前路径,执行DOS命令: java -jar demo.jar –server.port=8081 ,在控制台可看到应用端口变成了8081。
实现原理: 默认情况下,SpringBoot会将这些命令行参数转化成一个 Property ,并将其添加到 Environment 上下文。
温馨提示: 由于命令行参数优先级非常之高,基本高于所有常见的外部配置,所以使用的时候要谨慎。详见 PropertySource 执行顺序 。
关闭方法: 如果想禁用命令行属性,可以设置如下操作:springApplication.setAddCommandLineProperties(false)
Ⅱ 如何在Spring容器中加载自定义的配置文件
自定义配置文件配置文件名为:project.properties,内容如下:[html] view plain # 是否开启逻辑删除 project_del.filter.on=false project_domain=修改Spring配置文件之前代码:[html] view plain <beanidbeanid="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <propertynamepropertyname="locations"> <list> <value>classpath:dbinfo.properties</value> </list> </property> </bean> 修改后的配置文件[html] view plain <beanidbeanid="propertyConfigurer" class="com.hisun.core.util."> <propertynamepropertyname="locations"> <list> <value>classpath:dbinfo.properties</value> <value>classpath:project.properties</value> </list> </property> </bean> 加入了classpath:project.properties,其为自定义的配置文件将PropertyPlaceholderConfigurer类修改为自定义类,PropertyPlaceholderConfigurer类的具体作用可以查资料这块儿不做详细介绍注意下:这个configurer类获取的是所有properties的属性map,如果希望处理某个properties文件,需要在properties中做一个命名区别,然后在加载的时候,根据key的前缀,进行获取。定义类类的具体内容为下,[java] view plain importjava.util.HashMap; importjava.util.Map; importjava.util.Properties; importorg.springframework.beans.BeansException; importorg.springframework.beans.factory.config.; importorg.springframework.beans.factory.config.PropertyPlaceholderConfigurer; publicclass { privatestatic Map ctxPropertiesMap; @Override protectedvoid processProperties( beanFactoryToProcess, Properties props)throws BeansException { super.processProperties(beanFactoryToProcess, props); ctxPropertiesMap =new HashMap(); for(Object key : props.keySet()) { String keyStr = key.toString(); if(keyStr.startsWith("project_")){ String value = props.getProperty(keyStr); ctxPropertiesMap.put(keyStr, value); } } } publicstatic Object getContextProperty(String name) { returnctxPropertiesMap.get(name); } } 定义获取配置文件中值的类SpringPropertiesUtil类的具体内容如下:[java] view plain importorg.springframework.beans.BeansException; importorg.springframework.context.ApplicationContext; importorg.springframework.context.ApplicationContextAware; importorg.springframework.stereotype.Component; /** * Spring-PropertiesUtil工具类 -获取属性值 * */ @Component publicclass SpringPropertiesUtil { publicstatic final String KEY = "propertyConfigurer"; privatestatic ApplicationContext applicationContext; publicvoid setApplicationContext(ApplicationContext applicationContext) throwsBeansException { SpringPropertiesUtil.applicationContext = applicationContext; } publicstatic ApplicationContext getApplicationContext() { returnapplicationContext; } /** * 获取配置文件中的内容 * * @param keyName * @return */ publicstatic String parseStr(String keyName) { cp = () applicationContext .getBean(KEY); returncp.getContextProperty(keyName).toString(); } /** * 获取配置文件中的内容 * * @param keyName * @return */ publicstatic int parseInt(String keyName) { cp = () applicationContext .getBean(KEY); returnInteger.parseInt(cp.getContextProperty(keyName).toString()); } /** * 获取配置文件中的内容 * * @param keyName * @return */ publicstatic double parseDouble(String keyName) { cp = () applicationContext .getBean(KEY); returnDouble.parseDouble(cp.getContextProperty(keyName).toString()); } } 这样,在项目当中就能够方便快速的获取properties文件中配置的参数如SpringPropertiesUtil.parseStr(“content”)
Ⅲ springboot实现动态加载远程配置文件
有个独立的API项目,该项目主要是对外部各个系统提供API接口,为了保证调用的安全,需要对请求进行校验,主要校验包括调用频率,访问IP,是否跨域和Token,其中IP和是否跨域的配置会根据接入方进行相应的修改,为了避免每次有新的接入方就得去修改一次配置文件并重启项目,所以打算使用动态配置的方式。 初级实现方案:API服务每隔5分钟向管理端请求一次数据,管理端添加IP和域白名单的管理,这个实现方案,简单好用,但是弊端也明显,管理端每次修改完配置后,客户端需要等待下次请求后才会加载对应的配置,同时,还需要自己管理获取到的配置文件 更新方案:在springboot启动时,先从远端获取配置文件,并将其加载进Environment对象中,其余的,就都交给Spring了。同时配合spring-cloud-context实现远程配置变更后,本地重新拉取配置并更新点进去之后,springboot会在这里初始化ConfigurableEnvironment对象 这里是给ConfigurableEnvironment做一些初始化工作,我们先不管了,重点在这里,listeners.environmentPrepared(environment);,Springboot通过事件,将Environment的加载分发出去 到此为止,我们就能像使用本地配置文件一样使用服务器上的配置文件了,但是这里还只实现了加载远程配置文件,我们还需要在远程配置文件变更时,实现配置文件的热更新
Ⅳ Maven-Spring多项目加载配置文件
1,classpath:applicationContext.xml改为classpath*:applicationContext.xml这么写也是一样的效果:classpath*:/applicationContext.xml2,在applicationContext.xml引用其它的配置文件:如果在同一个专jar包这么写,
Java代码
<importresource="classpath:/applicationContext-action.xml"/>
要导入其它jar包中属的配置文件,这么写
Java代码
<importresource="classpath*:/applicationContext-service.xml"/>
就这么简单,重新打包、部署、启动成功。
Ⅳ 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已经支持了。
Ⅵ 二、springboot配置文件
1. 配置文件 Spring Boot使用一个全局的配置文件 application.properties application.yml 配置文件的作用:修改Spring Boot自动配置的默认值,SpringBoot在底层都给我们自动 配置好。有什么配置项,可以移步官方文档 配置文件一般放在src/main/resources目录或者类路径/confifig下,当然还有很多位置可 以放,它们会有不同优先级,后面会讲到。 YAML (YAML Ain't Markup Language) 简单介绍 <!–绑定配置文件处理器,配置文件进行绑定的时候就会有提示–> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <!– 将应用打包成一个可执行Jar包,直接使用java -jar xxxx的命令来执行 –> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>以前的配置文件:大多是xml .yml是YAML语言的文件,以数据为中 心,比json、xml等更适合做配置文件 全局配置文件的可以对一些默认配置值进行修改 配置实例 xml: yml: 2. YAML语法 基本语法 K:(空格)V 标识一对键值对 以空格的缩进来控制层级关系 只要是左对齐的一列数据,都是同一层级的 属性和值也是大小写敏感 实例: 值的写法 普通的值 k: v 字面量直接来写,字符串默认不用添加单引号 " " 双引号 不会转义字符串里面的特殊字符; <server> <port>8081</port> </server> server: port: 8081 server: port: 8081 path: /hello // 冒号后面的空格不要拉下' ' 单引号 会转义字符,特殊字符最终是一个普通的字符串 对象 普通写法: 行内写法 frends:{ lastName: zhang,age: 18 } Map 示例: maps: {k1: v1,k2: v2} 数组 普通写法: pets: // var onj = {pets: ['cat','pig','dog']} – cat – pig – dog 行内写法 pets:[cat, pig, dog] 配置文件获取 将配置文件中的每一个值映射到此组件中 1. Persion name: "wang \n qian" // 输出:wang 换行 qian frends: lastName: zhang age: 20package com.wrq.boot.bean; @Component @ConfigurationProperties(prefix = "persion") public class Persion { private String name; private int age; private double weight; private boolean boss; private Date birth; private Map<String,Object> maps; private List<Object> list; private Dog dog; 此处,这个bean的getter、setter和tostring方法已经省略,千万不能忽略! } @ConfifigurationProperties 意思是:我们类里面的属性和配置文件中的属性做绑定 不使用此注解,可以在bean的属性添加@value()注解,如下: @Component // @ConfigurationProperties(prefix = "persion") public class Persion { @value("${persion.name}") // $()读取配置文件、环境变量中的值 private String name; @value("#{11*2}") // #{SpEL} 采用表达式 private int age; @value("true") // 直接赋值 private boolean boos; } 此处采用@ConfifigurationProperties的方式,@value()和@ConfifigurationProperties的 区别见下方表格。prefifix = "persion" 配置文件中那个下面的属性来一一映射 @Component 如果想要这个注解起作用,必须放到容器里面 2. Dog package com.wrq.boot.bean; public class Dog { // 用作Persion中的属性 private String name; private int age; 此处,这个bean的getter、setter和tostring方法已经省略,千万不能忽略! } 3. 配置文件 方式一: application.yml persion: name: 王大锤 age: 18 weight: 125 boss: false birth: 2018/5/5 maps: {k1: v1,k2: v2} list: – wangli – wang dog: name: xiaogou age: 2方式二: application.propertiespersion.name = 王大锤 persion.age = 18 persion.weight = 125 persion.boss = false persion.birth = 2018/5/5 persion.maps.k1 = v1 persion.maps.k2 = v2 persion.dog.name = xiaogou persion.dog.age = 15 4. 测试类:BootApplicationTests package com.wrq.boot; @RunWith(SpringRunner.class) @SpringBootTest public class BootApplicationTests { @Autowired Persion persion; @Test public void contextLoads() { System.out.print(persion); } } 5. 运行 BootApplicationTests方法 控制台打印: application.yml的结果: Persion{name='王大锤', age=18, weight=125.0, boss=false, birth=Sat May 05 00:00:00 CST 2018, maps={k1=v1, k2=v2}, list=[wangli, wang], dog=Dog{name='xiaogou', age=2}} application.properties的结果: Persion{name='��Ǭ', age=18, weight=125.0, boss=false, birth=Sat May 05 00:00:00 CST 2018, maps={k2=v2, k1=v1}, list=[wangli, wang], dog=Dog{name='xiaogou', age=15}} 把Bean中的属性和配置文件绑定,通过yml文件和properties都可以做到,但是properties 文件出现乱码。 properties中文读取乱码:File->Settings->File Encodings最底部选utf-8、Tranparent打 上勾 注解比较 @value和@ConfifigurationProperties获取值比较名词解释: 松散绑定 last-name和lastName都可以获取导致,则代表支持松散绑定 [email protected] @ConfigurationProperties(prefix = "persion") // 如果使用的是@value注入值 时,无法使用校验 @Validated // 添加此注解 public class Persion { @Email // 配置文件书写的属性必须是邮箱格式,不符合报错! private String name; } 复杂类型封装 如果获取配置文件中map的值时,@value是获取不到值的 @value("${persion.maps}") // 由于使用的是@value,无法获取配置文件中的map private Map<String,Object> maps; @PropertySource @PropertySource:加载指定配置文件 @ConfifigurationProperties()默认是从全局配置文件中获取值,也就是 application.properties这个文件中获取值。 如果做的配置很多,全局的配置文件就会特别大,为了方便管理。我会创建不同的配置文 件定向管理不同的配置。 如创建persion.properties文件单独存放persion需要的配置 @PropertySource就是用来导入创建的配置文件 示例: 1. persion.properties 同时把两个全局的配置中关于Persion的配置都注释掉persion.name = 王弟弟 persion.age = 18 persion.weight = 125 persion.boss = false persion.birth = 2018/5/5 persion.maps.k1 = v1 persion.maps.k2 = v2 persion.dog.name = xiaogou persion.dog.age = 15 2. Persion package com.wrq.boot.bean; @Component @PropertySource(value = {"classpath:persion.properties"}) @ConfigurationProperties(prefix = "persion") public class Persion { private String name; private int age; private double weight; private boolean boss; private Date birth; private Map<String,Object> maps; private List<Object> list; private Dog dog; 此处,这个bean的getter、setter和tostring方法已经省略,千万不能忽略! } 这样运行测试类,控制台就可以打印persion.properties中的数据。 通过下面的注解,把类路径下的persion.properties加载进来。并且把persion开头的数 据进行绑定。 @PropertySource(value = {"classpath:persion.properties"})@ConfifigurationProperties(prefifix = "persion") @ImportResource @ImportResource:导入Spring的配置文件,让配置文件生效。 示例: 1. com.wrq.boot.service package com.wrq.boot.service; /** * Created by wangqian on 2019/1/12. */ public class HelloService { } 2. resources目录手动建立bean.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="helloService" class="com.wrq.boot.service.HelloService"> </bean> </beans> 3. 测试类 package com.wrq.boot; @RunWith(SpringRunner.class) @SpringBootTest public class BootApplicationTests { @Autowired ApplicationContext ioc;@Test public void testConfig() { boolean b = ioc.containsBean("helloService"); System.out.print(b); } } 试图通过添加一个Spring的配置文件bean.xml来把HelloService注入进去。 运行测试类结果:false 结果表明IoC容器中并不包含HelloService,即:配置文件bean.xml没有生效 解决方式 方式一: 主程序中进行配置@ImportResouece注解 package com.wrq.boot; @ImportResource(locations = {"classpath:bean.xml"}) // 通过此配置是 bean.xml生效 @SpringBootApplication public class BootApplication { public static void main(String[] args) { //应用启动起来 SpringApplication.run(BootApplication.class, args); } } 方法二:通过配置类实现,这种方式也是Spring Boot推荐的 1. com.wrq.boot.confifigpackage com.wrq.boot.config; /** * Created by wangqian on 2019/1/12. */ @Configuration public class MyConfig { // 将方法的返回值添加到容器之中,并且容器中这个组件的id就是方法名 @Bean public HelloService helloService(){ System.out.print("通过@Bean给容器添加组件了.."); return new HelloService(); } } @Confifiguration标注这是一个配置类 通过@Bean注解,将方法的返回值添加到容器之中,并且容器中这个组件的id就是方 法名 2. 把主程序类中@ImportResource()配置注释掉 3. 测试成功,添加了HelloService()组件 3. 配置文件占位符 随机数 RandomValuePropertySource:配置文件中可以使用随机数 ${random.value} ${random.int} ${random.long} ${random.uuid} ${random.int(10)} ${random.int[1024,65536]} 属性配置占位符可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用) ${app.name:默认值}来指定找不到属性时的默认值 persion.name = 王弟弟${random.uuid} persion.age = ${random.int} persion.dog.name = ${persion.name}_dog 4. Profifile 多环境支持 Profifile是Spring对不同环境提供不同配置功能的支持,可以通过激活、 指定参数等方式 快速切换环境 1. 多Profifile的方式 格式:application-{profifile}.properties/yml application-dev.properties application-prod.properties 默认采用application.properties配置文件,如果使用别的,需要激活: 1. application.properties中配置: # 激活application-dev.properties配置文件 spring.profiles.active=dev 2. application-dev.properties: server.port=8082 3. 运行BootApplication主程序: 2019-01-12 20:46:09.345 INFO 14404 — [main] s.b.c.e.t. : Tomcat started on port(s): 8082 (http) 2. 多文档块的方式 除了上方多Profifile的方式来切换环境,也可以通过YAML多文档块的方式。示例: application.yml: server: port: 8081 spring: profiles: active: dev — spring: profiles: dev server: port: 8083 — spring: profiles: prod server: port: 8084 3. 激活指定Profifile 1. application.properties中配置: # 激活application-dev.properties配置文件 spring.profiles.active=dev 2. application.yml中配置 server: port: 8081 spring: profiles: active: dev — spring: profiles: dev server: port: 80833. 启动配置-参数 在IDE中,类似于配置tomcat的地方,按下方配置: Program arguments:–spring.profiles.active=dev 4. 启动配置-虚拟机 在IDE中,类似于配置tomcat的地方,按下方配置: VM options:-Dspring-profiles-active=dev 5. 命令行 使用Maven的package命令打包,移动到jar的目录。 java -jar spring-boot-project-config.jar –spring.profiles.active=dev 5. 配置文件优先级 GitHub对应项目:boot-confifig-position 优先级 Spring Boot 启动会扫描以下位置的application.properties或者 application.yml文件作 为Spring boot的默认配置文件 fifile:./confifig/ (项目根目录confifig文件夹下的配置文件) fifile:./ (项目根目下的配置文件) classpath:/confifig/ (resources目录confifig文件夹下的配置文件) classpath:/ (resources目下的配置文件) 以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆 盖低优先级配置内容,形成互补配置。 默认配置 我们也可以通过配置spring.confifig.location来改变默认配置。 项目打包后以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新 位置;指定配置文件和默认加载的这些配置文件共同起作用,形成互补配置。 1. Maven->package对项目打包2. 把待使用的配置文件放在本地文件夹中,如:D:/application.properties 3. 命令行执行命令 java -jar boot-config-position-xxxxxx.jar — spring.config.location=D:/application.properties 这样即使项目上线了,我们也可以通过修改本地的配置文件,使用一行命令即可,极大方 便了运维人员。 6. 外部配置加载顺序 Spring Boot 支持多种外部配置方式 可以从以下位置加载配置,优先级从高到低,高优先级配置覆盖低优先级的,所以配置形 成互补配置。 1. 命令行参数 java -jar boot-config-position-xxxxxx.jar –server.port // 多个配置用空格 隔开 2. 来自java:comp/env的JNDI属性 3. Java系统属性(System.getProperties()) 4. 操作系统环境变量 5. RandomValuePropertySource配置的random.*属性值 6. jar包外部的application-{profifile}.properties或application.yml(带spring.profifile)配 置文件 7. jar包内部的application-{profifile}.properties或application.yml(带spring.profifile)配 置文件 8. jar包外部的application.properties或application.yml(不带spring.profifile)配置文件 9. jar包内部的application.properties或application.yml(不带spring.profifile)配置文件 10. @Confifiguration注解类上的@PropertySource 11. 通过SpringApplication.setDefaultProperties指定的默认属性 注意:从jar包外向jar包内寻找,优先加载profifile最后加载不带profifile,更多参考官方文 档 7. 自动配置原理GitHub对应项目:boot-confifig-autoconfifig 1. 配置文件写什么? 配置文件可配置属性查阅 2. 什么是注解,如何实现一个注解? 关于注解的机制和相关原理可以移步此篇博客 3. 配置原理解析 我们运行Spring Boot应用是从main方法启动,在主程序类上有一个 @SpringBootApplication注解。 @SpringBootApplication是一个复合注解,包括@ComponentScan,和 @SpringBootConfifiguration,@EnableAutoConfifiguration。 @SpringBootConfifiguration继承自@Confifiguration,二者功能也一致,标注当前类 是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到 srping容器中,并且实例名就是方法名。 @EnableAutoConfifiguration的作用启动自动的配置,@EnableAutoConfifiguration注 解的意思就是SpringBoot根据你添加的jar包来配置你项目的默认配置,比如根据 spring-boot-starter-web ,来判断你的项目是否需要添加了webmvc和tomcat,就 会自动的帮你配置web项目中所需要的默认配置 @ComponentScan,扫描当前包及其子包下被@Component,@Controller, @Service,@Repository注解标记的类并纳入到spring容器中进行管理。是以前的co ntext:component-scan(以前使用在xml中使用的标签,用来扫描包配置的平行支 持)。 @SpringBootApplication注解分析 配置原理视频讲解 4. 自动配置类判断 在配置文件properties中设置:debug=true 来让控制台打印自动配置报告,方便的得知 那些配置类生效。 ========================= AUTO-CONFIGURATION REPORT =========================Positive matches: —————– matched: – @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition) – @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) Negative matches: —————– ActiveMQAutoConfiguration: Did not match: – @ConditionalOnClass did not find required classes 'javax.jms.ConnectionFactory', 'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition)
Ⅶ Spring Boot 第二弹,配置文件详解-史上最全
Spring Boot 官方 提供了两种常用的配置文件格式,分别是 properties 、 YML 格式。相比于 properties 来说, YML 更加年轻,层级也是更加分明。 强烈推荐使用 YML 格式
Spring Boot项目 启动会扫描以下位置的 application.properties 或者 application.yml 作为默认的配置文件.
徒手撕源码
内部类Loader的load方法
getSearchLocations()方法
asResolvedSet()
下面给出优先级 从高到低 的配置文件排列顺序:
以设置应用端口为例 初体验Spring Boot配置文件
properties后缀结尾(application.properties)
yml/yaml后缀结尾(application.yml/application.yaml)
数字,字符串,布尔,日期
对象、Map
数组
数字,字符串,布尔,日期
对象、Map
数组
@ConfigurationProperties(prefix = “person”)详解
标注在类上
标注在方法上
综上所述 @ConfigurationProperties 注解能够轻松的让配置文件跟实体类绑定在一起。
值得关注的是: @ConfigurationProperties 这个注解仅仅是支持从 Spring Boot的默认配置文件 中取值,也就是 application.properties 、 application.yml 、 application.yaml ,那我们如何从自定义配置文件取值呢??? 别着急,有解决办法,那就是再加一个注解: @PropertySource(value = “classpath:custom-profile.properties”) ,下面会有对 @PropertySource 注解的介绍。请耐心往下面看。
使用@PropertySource注解
对应配置文件
创建两个配置文件 custom-profile.yml、custom-profile1.yml ,如下去引入。
我们可以通过控制变量法进行测试,具体过程我这里就不赘述了。 直接说 结论 吧: Spring加载顺序 为 从左到右顺序加载 ,后加载的会 覆盖 先加载的属性值。
另外需要注意的是 : @PropertySource 默认加载 xxx.properties类型 的配置文件,不能加载 YML格式 的配置文件。如何解决呢?下面来解决这一问题
对应配置文件:
编写PropertiesController
扩展功能
application.yml 主配置文件
application-dev.yml 开发配置文件
application-prod.yml 生产配置文件
application-test.yml 测试配置文件
(1)主配置文件:配置激活选项
(2)其他配置文件:指定属于哪个环境(同yml,只不过表现形式是 key=value 的,三个配置文件分别是: application-dev.properties , application-prod.properties , application-test.properties )
无论是使用上述 多文档块 的方式,还是新建 application-test.yml 文件,都可以在配置文件中指定 spring.profiles.active=test 激活指定的profile。
感谢阅读小生文章。祝大家早日富可敌国,实现财富自由。 写文不易 ,一定要 点赞、评论、收藏哦 , 感谢感谢感谢!!!
Ⅷ Spring加载配置文件的方式
转: https://blog.csdn.net/HaHa_Sir/article/details/79105951 1、用法示例团知培: 在spring.xml配置文件中添加标签 2、在 spring.xml 中使用配置文件属性: 3、在java文件中使用: 需开启注解注入: <context:annotation-config/> 或 <context:component-scan/> 1、用法示例: 在spring.xml配置文件中添加标签 2、在spring.xml 中使用配置文件塌唯属性: 3、在java文件中使用: 1、用法示例:猛梁在java类文件中使用 PropertySource 注解: 2、在java文件中使用: 1、用法示例:在 spring.xml 中使用 <bean>标签进行配置 2、 PropertyPlaceholderConfigurer 配置方法,等价于 方式一,用法参考方法一 五、 还可以使用 org.springframework.beans.factory.config.PropertiesFactoryBean 加载,这里不再逐一列举了。
Ⅸ Spring加载XML的过程
首先,Spring加载配置文件是在refresh#obtainFreshBeanFactory方法中进行的。 逻辑是在loadBeanDefinitions方法中进行的,Spring对loadBeanDefinitions方法做了很多重载。 在new ResourceEntityResolver(this)中 这里初始化了xsd/dtd的映射类,现在一般是使用xsd。 PluggableSchemaResolver#resolveEntity方法会读取META-INF/Spring.schemas文件,该文件配置的是kv数据,k是xsd的网络地址,v是本地地址,为了防止在未联网的情况下解析不了标签。这里遍历了配置文件数组 doLoadDocument加载了配置文件主要看registerBeanDefinitions方法 parseBeanDefinitionElement( Element ele, String beanName, @Nullable BeanDefinition containingBean) 在这个方法中就是解析标签中的属性了,将BeanDefinition创建出来,把属性set到BeanDefinition中
Ⅹ 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