SpringBoot六种加载配置文件的方式

发布于:2024-12-19 ⋅ 阅读:(11) ⋅ 点赞:(0)

一、@Value

必须是Bean类

@RestController
@RequestMapping("/envTest")
public class EnvTestController {

    @Value("${ruoyi.name}")
    private String name;

    @GetMapping("/readEnv")
    public String readEnv() {
        return name;
    }
}

在这里插入图片描述

为静态方法赋值
@Component
public class YamlConfig {

    @Value("${spring.dynamic.datasource.druid.master.url}")
    private String MASTER_URL;

    private static String DATASOURCE_URL;

    @PostConstruct
    public void afterPropertiesSet() throws Exception {
        this.DATASOURCE_URL = MASTER_URL;
    }

    public static String getAllTableNameBySchema() {
        return DATASOURCE_URL;
    }
}
@RestController
@RequestMapping("/envTest")
public class EnvTestController {

    @GetMapping("/readEnv")
    public String readEnv() {
        return YamlConfig.getAllTableNameBySchema();
    }
}

在这里插入图片描述

二、@ConfigurationProperties

通过自动绑定和类型转换等机制,将指定前缀的属性集合自动绑定到一个Bean对象上。

  1. 新建一个配置类接受配置文件的相关参数
@Data
@Configuration
@ConfigurationProperties(prefix = "ruoyi")
public class RuoYi {

    private String name;

    private String version;

    private String copyrightYear;

    private String profile;

    private boolean addressEnabled;

    private String captchaType;
}
  1. 使用时直接从@Resource注入依赖即可获取
@RestController
@RequestMapping("/envTest")
public class EnvTestController {

    @Resource
    private RuoYi ruoYi;

    @GetMapping("/readEnv")
    public String readEnv() {
        return JSON.toJSONString(ruoYi);
    }
}

在这里插入图片描述

三、Environment

注入Environment类即可

@RestController
@RequestMapping("/envTest")
public class EnvTestController {

    @Resource
    private Environment environment;

    @GetMapping("/readEnv")
    public String readEnv() {
        return environment.getProperty("ruoyi.name");
    }
}

在这里插入图片描述

也可以通过实现EnvironmentAware接口,重写setEnvironment

@RestController
@RequestMapping("/envTest")
public class EnvTestController implements EnvironmentAware {

    private Environment env;

    @GetMapping("/readEnv")
    public String readEnv() {
        return env.getProperty("ruoyi.name");
    }

    @Override
    public void setEnvironment(Environment environment) {
        this.env = environment;
    }
}
以上是获取系统默认的配置文件。application.yml或者application.properties文件。

以下是获取自定义配置文件的方法。

四、@PropertySources加载Properties文件

只能加载.properties文件

在这里插入图片描述

@RestController
@RequestMapping("/envTest")
@PropertySources({
        @PropertySource(value = "classpath:a.properties",encoding = "UTF-8")
})
public class EnvTestController {

    @Value("${name}")
    private String aname;

    @GetMapping("/readEnv")
    public String readEnv() {
        return aname;
    }
}

乱码解决:将这几处设置都标记为UTF-8,同时勾上Transparent native-to-ascii conversion的选项,然后重新创建approperties文件。

在这里插入图片描述

在这里插入图片描述

五、YamlPropertiesFactoryBean加载yaml文件

  1. 通过YamlPropertiesFactoryBean类将yml配置文件注入到Bean中。

    @Configuration
    public class YamlConfig {
    
        @Bean
        public static PropertySourcesPlaceholderConfigurer yamlConfigurer() {
            PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
            YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
            yaml.setResources(new ClassPathResource("test.yml"));
            configurer.setProperties(Objects.requireNonNull(yaml.getObject()));
            return configurer;
        }
    
    }
    
  2. 通过@Value或者Environment.getProperty()方法获取到定义的属性值

    @RestController
    @RequestMapping("/envTest")
    public class EnvTestController {
    
        @Value("${animal.name}")
        private String aname;
    
        @GetMapping("/readEnv")
        public String readEnv() {
            return aname;
        }
    }
    

在这里插入图片描述

在这里插入图片描述

六、自定义读取

@RestController
@RequestMapping("/envTest")
public class EnvTestController {

    @GetMapping("/readEnv")
    public String readEnv() {
        Properties properties = new Properties();
        try {
            InputStreamReader inputStreamReader = new InputStreamReader(
                    this.getClass().getClassLoader().getResourceAsStream("a.properties"),
                    StandardCharsets.UTF_8
            );
            properties.load(inputStreamReader);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return properties.getProperty("name");
    }
}

在这里插入图片描述