美文网首页程序员程序员小天地
@ConfigurationProperties获取配置文件

@ConfigurationProperties获取配置文件

作者: 小草莓子桑 | 来源:发表于2020-05-22 16:14 被阅读0次

    项目中已经会用到配置文件,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,谢谢!

    相关文章

      网友评论

        本文标题:@ConfigurationProperties获取配置文件

        本文链接:https://www.haomeiwen.com/subject/zzsgwhtx.html