侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 285 篇文章
  • 累计创建 125 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

springboot加载指定的属性文件(properties和yml文件)

孔子说JAVA
2021-08-23 / 0 评论 / 0 点赞 / 104 阅读 / 6,934 字 / 正在检测是否收录...

springboot提供了多个注解可以将外部的值动态注入到Bean中,最常用的包括 @Value注解@ConfigurationProperties注解 。这些注解只能读取默认的配置文件 application.properties ,要想加载非默认配置文件,需结合 @PropertySource 使用。

1、properties配置文件

1.1 默认名称的配置文件application.properties

spring.jdbc.username=admin
spring.jdbc.password=pwd123
...

1.1.1 @Value注解注入属性到bean

@Component
public class JdbcConfig
{
    @Value("${spring.jdbc.username}")
    private String username;

    @Value("${spring.jdbc.password}")
    private String password;

    //省略getter与setter方法...
}

1.1.2 @ConfigurationProperties注解注入属性到bean

@Component
@ConfigurationProperties(prefix = "spring.jdbc")
public class JdbcConfig
{
    private String username;
 
    private String password;
 
    //省略getter与setter方法...
}

1.1.3 @Value与@ConfigurationProperties结合使用

假如在配置文件中还有一个spring.name属性,则可以按如下形式使用。

@Component
@ConfigurationProperties(prefix = "spring.jdbc")
public class JdbcConfig
{
    private String username;
 
    private String password;

    @Value("${spring.name}")
    private String name;
 
    //省略getter与setter方法...
}

1.2 非默认名称的配置文件config/mail.properties

mail.host=smtp.qq.com
mail.port=587
...

1.2.1 @PropertySource注解加载properties文件

PropertySource注解的作用是加载指定的属性文件,配置属性如下 @PropertySource(value= {"classpath:config/mail.properties"},ignoreResourceNotFound=false,encoding="UTF-8",name="mail.properties")

  • 其中value是设置需要加载的属性文件,可以一次性加载多个(多个时以,分隔);
  • encoding用于指定读取属性文件所使用的编码,我们通常使用的是UTF-8;
  • ignoreResourceNotFound含义是当指定的配置文件不存在是否报错,默认是false;如这里配置的config/mail.properties,若在classpath路径下不存在时,则ignoreResourceNotFound为true的时候,程序不会报错,如果ignoreResourceNotFound为false的时候,程序直接报错。实际项目开发中,最好设置ignoreResourceNotFound为false,该参数默认值为false。
  • name的值我们设置的是mail.properties。这个值在Springboot的环境中必须是唯一的,如果不设置,则值为:class path resource [config/mail.properties]
@Component
@ConfigurationProperties(prefix = "mail")
@PropertySource(value = "classpath:config/mail.properties",encoding = "UTF-8")
public class MailConfig
{
    private String host;
 
    private String port;
 
    //省略getter与setter方法...
}

1.2.2 @PropertySource注解加载yml文件

在1.2.1中,若配置文件为config/mail.yml时,配置属性不会注入到MailConfig的bean中。查看源代码发现,@PropertySource不支持 yml 文件的解析,该注解有个factory 这个属性,作为解析资源文件的工厂类,默认实现是 DefaultPropertySourceFactory,只需要实现能解析yml的工厂类即可以解决该问题。

2、yml配置文件支持

2.1 yml配置文件 config/mail.yml

mail:
  host: smtp.qq.com
  port: 587

2.2 解析yml文件的工厂类

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.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;

import java.io.IOException;
import java.util.Properties;

/**
 * PropertySource支持yml配置文件
 *
 * @Author kongzi
 * @Version 1.0
 */
public class YamlPropertySourceFactory implements PropertySourceFactory {
    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
        YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
        factory.setResources(resource.getResource());
        factory.afterPropertiesSet();
        Properties ymlProperties = factory.getObject();
        String propertyName = name != null ? name : resource.getResource().getFilename();
        return new PropertiesPropertySource(propertyName, ymlProperties);
    }
}

2.3 @PropertySource注解加载yml文件

@Component
@ConfigurationProperties(prefix = "mail")
@PropertySource(value = "classpath:config/mail.yml", factory = YamlPropertySourceFactory.class)
public class MailConfig
{
    private String host;
 
    private String port;
 
    //省略getter与setter方法...
}

3、@value注解其他形式

@Value注解实现以下几种情况:

  • (1)注入普通字符;
  • (2)注入操作系统属性;
  • (3)注入表达式运算结果;
  • (4)注入其他Bean的属性;
  • (5)注入文件内容;
  • (6)注入网址内容;
  • (7)注入属性文件。
package com.kongzi;
 
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.env.Environment;
import org.springframework.core.io.Resource;
 
/**
 * 配置类
 **/
@Configuration
@ComponentScan("com.kongzi")
@PropertySource("classpath:db.properties")
public class ElConfig
{
    /**
     * 注入普通字符串
     */
    @Value("您好,欢迎访问 carefree 的博客")
    private String comment;
 
    /**
     * 注入操作系统属性
     */
    @Value("#{systemProperties['os.name']}")
    private String osName;
 
    /**
     * 注入表达式运算结果
     */
    @Value("#{ T(java.lang.Math).random() * 100.0 }")
    private double randomNumber;
 
    /**
     * 注入其他Bean的属性
     */
    @Value("#{otherUser.userName}")
    private String fromUserName;
 
    @Value("#{otherUser.blogUrl}")
    private String fromBlogUrl;
 
    /**
     * 注入文件资源
     */
    @Value("classpath:info.txt")
    private Resource testFile;
 
    /**
     * 注入网址资源
     */
    @Value("https://blog.csdn.net/carefree31441")
    private Resource testUrl;
 
    /**
     * 注入配置文件
     */
    @Value("${jdbc.driver}")
    private String jdbc_driver;
 
    @Value("${jdbc.url}")
    private String jdbc_url;
 
    @Value("${jdbc.username}")
    private String jdbc_username;
 
    @Value("${jdbc.password}")
    private String jdbc_password;
 
    @Autowired
    private Environment environment;
 
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyConfigurer()
    {
        return new PropertySourcesPlaceholderConfigurer();
    }
 
    public void outputResource()
    {
        try
        {
            System.out.println("注入普通字符串:");
            System.out.println(comment);
            System.out.println("------------------------------------------------");
 
            System.out.println("注入操作系统属性:");
            System.out.println(osName);
            System.out.println("------------------------------------------------");
 
            System.out.println("注入表达式运算结果:");
            System.out.println(randomNumber);
            System.out.println("------------------------------------------------");
 
            System.out.println("注入其他Bean的属性:");
            System.out.println("用户名称:" + fromUserName);
            System.out.println("博客地址:"+ fromBlogUrl);
            System.out.println("------------------------------------------------");
 
            System.out.println("注入文件资源:");
            System.out.println("文件中的内容:" + IOUtils.toString(testFile.getInputStream()));
            System.out.println("------------------------------------------------");
 
            System.out.println("注入配置文件(方式一):");
            System.out.println("数据库驱动:" + jdbc_driver);
            System.out.println("数据库连接:" + jdbc_url);
            System.out.println("数据库用户:" + jdbc_username);
            System.out.println("数据库密码:" + jdbc_password);
            System.out.println("------------------------------------------------");
 
            System.out.println("注入配置文件(方式二):");
            System.out.println("数据库驱动:" + environment.getProperty("jdbc.driver"));
            System.out.println("数据库连接:" + environment.getProperty("jdbc.url"));
            System.out.println("数据库用户:" + environment.getProperty("jdbc.username"));
            System.out.println("数据库密码:" + environment.getProperty("jdbc.password"));
            System.out.println("------------------------------------------------");
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}
0

评论区