SpringBoot配置文件值注入的几种方式

在使用springboot项目开发的时候,像数据库配置信息这些我们更希望他配置在专门的文件,这样发版可以方便运维来进行维护,下面提供以下几种方式供大家学习。

一、@ConfigurationProperties

作用:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;

这是本人的另一篇博客,对该注解讲解了一下基本用法。

链接: 相关讲解.

二、@Value

application.properties,用yml文件也是可以的。
这里填写数据库链接信息

datasource.url=123
datasource.username=456
datasource.password=789
datasource.gw-url=127.0.0.1

存放数据库信息的表,这里我们将它注入到容器当中,用的时候直接从容器当中取即可。

@Component
public class DruidDBConfig {
    
    
	@Value("${datasource.url}")  
    private String url;  
    
    @Value("${datasource.username}")  
    private String username;  
    
    @Value("${datasource.password}")  
    private String password; 
    
    @Value("${datasource.gw-url}")  
    private String gwUrl;
}

junit测试,成功获取到配置文件注入的值
在这里插入图片描述
他的实际原理其实就是跟xml当中的bean一样,依靠set方法对bean进行赋值,并存放到容器。

<bean class="Person">
     <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>
<bean/>

三、@ConfigurationProperties和@Value绑定的区别

1、松散绑定:

这个指的是驼峰命名。
假如用的@ConfigurationProperties方式:properties当中写的person.last-name,而java当中的属性名称private String lastName;写成这样照样可以注入值,而@Value注解是不可以的。

2、SpEL支持

SpEL(Spring Expression Language),即Spring表达式语言,是比JSP的EL更强大的一种表达式语言。为什么要总结SpEL,因为它可以在运行时查询和操作数据,尤其是数组列表型数据,因此可以缩减代码量,优化代码结构。

@Value("#{表达式}")
public String arg;

@Value("#{11*2}")
private Integer age;

3、JSR303数据校验

JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator。
此实现与 Hibernate ORM 没有任何关系。 JSR 303 用于对 Java Bean 中的字段的值进行验证。

在类上添加@Validated这个注解然后就开启了校验注解。然后我们就可以使用他的一些特殊注解,比如@Email

4、复杂类型封装

@ConfigurationProperties可以对map以及list等集合赋值,而@Value是不可以的。

5、总结

在这里插入图片描述

三、@PropertySource

作用:加载指定的配置文件;
上面所述的两个注解都是注入值,并且值都是在application主配置文件配置,才能注入。
我们可以使用@PropertySource来将一些固定信息配置独立出来一个配置文件。
他是可以和@ConfigurationProperties和@Value一起来使用的。
用法详解:
创建DruidDBConfig.properties

datasource.url=123
datasource.username=456
datasource.password=789
datasource.gw-url=127.0.0.1
package com.atguigu.springboot.bean;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource(value = {
    
    "classpath:DruidDBConfig.properties"})
public class DruidDBConfig {
    
    
	
	
	@Value("${datasource.url}")  
    private String url;  
    
    @Value("${datasource.username}")  
    private String username;  
    
    @Value("${datasource.password}")  
    private String password; 
    
    @Value("${datasource.gw-url}")  
    private String gwUrl;

	@Override
	public String toString() {
    
    
		return "DruidDBConfig [url=" + url + ", username=" + username + ", password=" + password + ", gwUrl=" + gwUrl
				+ "]";
	}
}

junit测试依然可以取到值
在这里插入图片描述

四、@ImportResource

有一些小伙伴在使用过程当中老是弄混他和@PropertySource的区别

@ImportResource作用::导入Spring的配置文件,让配置文件里面的内容生效;

还有一个跟这个注解相似,那就是@Import,他可以直接加载类配置文件,使用这个注解加载的类会直接存放到IOC容器当中。

@ImportResource可以用来加载xml配置文件

想让Spring的xml配置文件生效,加载进来;@ImportResource标注在一个配置类上,启动类也是可以的。

@ImportResource(locations = {
    
    "classpath:beans.xml"}) 
导入Spring的配置文件让其生效

编写Spring的配置文件

<?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.gzl.springboot.service.HelloService"></bean> 
</beans>

猜你喜欢

转载自blog.csdn.net/weixin_43888891/article/details/110943294