项目中已经会用到配置文件,spring项目中可以用@Value来获取配置,今天来说说springboot项目中通过@ConfigurationProperties获取配置文件
@ConfigurationProperties
先来说下@ConfigurationProperties这个注解
直接简单截取源码来说
package org.springframework.boot.context.properties;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ConfigurationProperties {
@AliasFor("prefix")
String value() default "";
@AliasFor("value")
String prefix() default "";
boolean ignoreInvalidFields() default false;
boolean ignoreUnknownFields() default true;
}
看到了这个注解包,要使用这个注解,直接引入spring-context相关就好了
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
举个栗子
- 实现一个小需求,通过配置文件实现一个权限控制的小需求
- 一共有两个角色admin、common
- admin权限可以操作index、item页面,并且对两个页面拥有增删改查权限
- common权限可以操作index页面,并且只有select权限
- 我们在配置文件中配置了一个角色菜单权限列表,配置文件使用yml格式
#用户角色
role:
#管理员角色
admin:
## 管理角色可以操作 index、item页面
## 对页面拥有insert,select,update,delete的权限
index: insert,select,update,delete
item: insert,select,update,delete
#普通角色
common:
## 普通角色只拥有 index页面。 select权限
index: select
先实现读取普通角色index页面的权限,就像相当于读取role.common.index的值
先创建一个实体类来读取这份配置文件,直接上代码:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {BootStartApplication.class})// 指定启动类
//使用前缀role.common,意思为读取的是 role.common后面的key
@ConfigurationProperties(prefix = "role.common")
public class TestRole {
/**
* 对应到 具体的key index
* 加上前缀就定位到了 role.common.index
*/
private String index;
public String getIndex() {
return index;
}
public void setIndex(String index) {
this.index = index;
}
@Test
public void test() {
System.out.println(JSON.toJSONString(index));
}
}
先看下运行结果:
运行结果
说下代码:
- @ConfigurationProperties(prefix = "role.common"),注解使用prefix 属性,就是说这个实体类读取的配置是role.common后面的这些key
- 实体类中index属性就具体把读取的配置文件定位到了index上了,加上前面的前缀就是这个属性值读取的是role.common.index的值
实现读取管理员角色admin拥有哪些权限
先创建一个实体类来读取这份配置文件,直接上代码:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {BootStartApplication.class})// 指定启动类
@ConfigurationProperties(prefix = "role")
public class TestRole {
private Map<String,String> admin;
public Map<String, String> getAdmin() {
return admin;
}
public void setAdmin(Map<String, String> admin) {
this.admin = admin;
}
@Override
public String toString() {
return new StringJoiner(", ", TestRole.class.getSimpleName() + "[", "]")
.add("admin=" + admin)
.toString();
}
@Test
public void test() {
System.out.println(JSON.toJSONString(admin));
}
}
先看下运行结果:
运行结果
说下代码:
- @ConfigurationProperties(prefix = "role"),注解使用prefix 属性,就是说这个实体类读取的配置是role后面的这些key
- 实体类中admin属性就具体把读取的配置文件定位到了admin上了,加上前面的前缀就是这个属性值读取的是role.common.admin的值
- 因为admin下面有两个key,这里就使用Map数据结构进行了读取。
{
"index": "insert,select,update,delete",
"item": "insert,select,update,delete"
}
实现读取所有的角色和他们的页面权限
先创建一个实体类来读取这份配置文件,直接上代码:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {BootStartApplication.class})// 指定启动类
@ConfigurationProperties()
public class TestRole {
private Map<String,String> role;
public Map<String, String> getRole() {
return role;
}
public void setRole(Map<String, String> role) {
this.role = role;
}
@Override
public String toString() {
return new StringJoiner(", ", TestRole.class.getSimpleName() + "[", "]")
.add("role=" + role)
.toString();
}
@Test
public void test() {
System.out.println(JSON.toJSONString(role));
}
}
看下执行结果:
执行结果
- @ConfigurationProperties(),这里面没有使用前缀,意思是实体类读取的是整个配置文件中的
- 实体类中role属性就具体把读取的配置文件定位到了role上了,加上前面的前缀就是这个属性值读取的是role的值
- 因为role下面有两个key,admin和common,而且每个下面又是多个key,所以使用了数据结构进行了读取。
- 读取到的结果是
{
"admin.index": "insert,select,update,delete",
"admin.item": "insert,select,update,delete",
"common.index": "select"
}
看结果是把role下面的每个key读取了出来,这样就是先了读取所有的角色和页面权限
springboot项目中通过@ConfigurationProperties获取配置文件就为大家分享到这里,欢迎大家来交流,指出文中一些说错的地方,让我加深认识,愿大家没有bug,谢谢!
网友评论