SpringBoot自定义配置文件/获取配置文件内容

SpringBoot自定义配置文件/获取配置文件内容

需要对项目代码中的内容进行更改,又不想每次都去改动逻辑代码,因此需要在逻辑代码中设置一个变量,这个变量接受配置文件中的值,这样就不用改动逻辑代码了, 只需要改动配置文件即可

起步

  1. application.yaml文件中定义一个键值对

    1. # 自定义的
      mucd:
        username: mucd cd
        age: 19
      # tomcat启动端口
      server:
        port: 80
      
  2. 创建一个controller类,MyController,在这个类中获取配置文件中的内容, 当然,配置文件中的内容不一定费用从controller中获取!

  3. MyCntroller.java

    1. 
      import org.springframework.beans.factory.annotation.Value;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RestController;
      
      /**
       * @author mucd
       * @time 2022/2/9 14:37
       */
      @RestController
      public class TestController {
      
          @Value("${mucd.username}")
          String username;
      
          @RequestMapping("/getUser")
          public String getUsername() {
              return username;
          }
      }
      
    2. @RestController注解 就是直接返回一个字符串,可以在浏览器页面上直接显示

    3. 使用 @Value("${mucd.username}")获取配置文件中的内容,这样就能获取遇到mucd下面的username的值了! 这里要特别注意, 如果配置文件中没有 ${}里面的值那么在spring boot启动的时候会有异常,然后启动失败。所以在写的时候要格外注意

    4. 为了避免出错我们还可以这样写@Value("${mucd.username:mucd}"),意思是如果在配置文件中没有mucd.username那么则会个有个一个默认的值就是后面的值

    5. 异常:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'mucd.uername' in value "${mucd.uername}"

    6. 在这里插入图片描述

  4. 下一步就可以启动springboot去浏览器 测试一下
    在这里插入图片描述

  5. 可以看到这和我们配置文件中的内容一样,这说明已经成功的获取到了。

  6. 再测试一下获取不到配置文件值的情况 这样就是获取的:后面的值

  7. 在这里插入图片描述

那么当我们的配置特别多的时候怎么办呢,总不能和这些框架的配置混在一起吧,我们还需要有自己的配置文件

自己的配置文件

  1. 对象的方式获取配置文件内内容

  2. 导入依赖

  3.  <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-configuration-processor</artifactId>
         <!--依赖不需要传递 子模块需要重新调用-->
         <optional>true</optional>
    </dependency>
    
  4. 创建配置文件 resource。yaml 文件名可以自定义,并且在配置文件中定义一些属性

  5. # 可以把user看作类名
    user:
      # 把user下面的看作是类的属性
      name: mcd
      age: 20
    
  6. 创建一个java文件,并且java文件中的属性要和配置文件中的对应

  7. package com.demo.config;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    
    /**
     * @author mucd
     * @author mucd
     * @time 2022/2/9 15:17
     */
    @Configuration
    @ConfigurationProperties(prefix = "user")
    
    /**
     * 如果是properties的文件可以不用写后面的factory属性
     */
    //@PropertySource(value = "classpath:/resource.properties")
    /**
     * 获取到自己配置文件的路径
     */
    @PropertySource(value = "classpath:/resource.yaml",factory = YamlResourceFactory.class)
    public class ResourceConfig {
        private String name;
        private int age;
    
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    
  8. 注意这里的YamlResourceFactory。class是自己自定义的一个类,这个类写好基本就不用改动了

  9. YamlResourceFactory.java

    package com.demo.config;
    
    import com.sun.istack.internal.NotNull;
    import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
    import org.springframework.core.env.PropertiesPropertySource;
    import org.springframework.core.env.PropertySource;
    import org.springframework.core.io.support.DefaultPropertySourceFactory;
    import org.springframework.core.io.support.EncodedResource;
    
    import java.io.IOException;
    import java.util.Properties;
    
    /**
     * 使用自定义的方法读取yaml瘟胶囊
     * @author mucd
     * @time 2022/2/9 15:21
     */
    public class YamlResourceFactory extends DefaultPropertySourceFactory {
        @Override
        public PropertySource<?> createPropertySource(@NotNull String name, @NotNull EncodedResource resource) throws IOException {
            final YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
            factory.setResources(resource.getResource());
            factory.afterPropertiesSet();
            final Properties object = factory.getObject();
            String propertyName = name != null ? name : resource.getResource().getFilename();
    
            assert propertyName != null;
            assert object != null;
            return new PropertiesPropertySource(propertyName, object);
    
        }
    }
    
  10. 最后在controller获取内容

  11. MyConfigTest.java

    @RestController
    public class MyConfigTest {
    
        @Autowired
        private ResourceConfig resourceConfig;
    
        @RequestMapping("/getConfig")
        public String getConfig() {
            return resourceConfig.getName() + "," + resourceConfig.getAge();
        }
    }
    
    
  12. 这里哟啊吧和yaml对应的类使用@Autowired注解自动注入进来,然后在调用对象的get属性即可

  13. 打开浏览器测试

  14. 在这里插入图片描述

  15. 测试成功!!!!

简单的从配置文件获取数据的两种方式就搞定啦 !
觉得有帮助的小伙伴不要吝啬手中的赞👍哦,哈哈

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值