Spring通过注解读取外部配置文件

一、使用注解@PropertySource

指定路径

使用 @PropertySource 指定配置文件路径,支持 properties 和 XML 的配置文件,但不支持 yml。

属性赋值

可以用注解 @Value 对属性直接赋值、${}获取配置文件的值、SPEL表达式#{}。 

  • 直接赋值:@Value("name jack")
  • 读取配置文件:@Value("${user.age}")
  • 指定默认值:@Value("${user.desc:default desc}") 表示如果没有user.desc的配置,则赋值为default desc
  • SPEL表达式:@Value("#{'${user.username}'?.toUpperCase()}") 表示将从配置文件读取的值转为大写,?可以不填,表示如果没有user.username的配置,则忽略
例子

config.properties内容

ps.datasource.driverClassName=com.mysql.jdbc.Driver
ps.datasource.jdbcUrl=jdbc:mysql://localhost:3306/spring?useTimezone=true&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useUnicode=true&characterEncoding=utf-8&tcpRcvBuf=1024000&useOldAliasMetadataBehavior=true&useSSL=false&rewriteBatchedStatements=true&useAffectedRows=true
ps.datasource.username=root
ps.datasource.password=root
ps.datasource.minIdle=1
ps.datasource.maxPoolSize=10
ps.datasource.connectionTimeout=3000
ps.datasource.idleTimeout=300000

配置类

/**
 * 使用@PropertySource指定具体的配置文件,用@Value设置具体的属性值, 不支持yml
 */
@Component
@PropertySource("classpath:config.properties")
public class DbProperties {

    @Value("${ps.datasource.driverClassName}")
    private String driverClassName;
    @Value("${ps.datasource.jdbcUrl}")
    private String jdbcUrl;
    @Value("${ps.datasource.username}")
    private String username;
    @Value("${ps.datasource.password}")
    private String password;
    @Value("${ps.datasource.minIdle}")
    private int minIdle;
    @Value("${ps.datasource.maxPoolSize}")
    private int maxPoolSize;
    @Value("${ps.datasource.connectionTimeout}")
    private int connectionTimeout;
    @Value("${ps.datasource.idleTimeout}")
    private int idleTimeout;

    public String getDriverClassName() {
        return driverClassName;
    }

    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }

    public String getJdbcUrl() {
        return jdbcUrl;
    }

    public void setJdbcUrl(String jdbcUrl) {
        this.jdbcUrl = jdbcUrl;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getMinIdle() {
        return minIdle;
    }

    public void setMinIdle(int minIdle) {
        this.minIdle = minIdle;
    }

    public int getMaxPoolSize() {
        return maxPoolSize;
    }

    public void setMaxPoolSize(int maxPoolSize) {
        this.maxPoolSize = maxPoolSize;
    }

    public int getConnectionTimeout() {
        return connectionTimeout;
    }

    public void setConnectionTimeout(int connectionTimeout) {
        this.connectionTimeout = connectionTimeout;
    }

    public int getIdleTimeout() {
        return idleTimeout;
    }

    public void setIdleTimeout(int idleTimeout) {
        this.idleTimeout = idleTimeout;
    }

    @Override
    public String toString() {
        return "DbProperties{" +
                "driverClassName='" + driverClassName + '\'' +
                ", jdbcUrl='" + jdbcUrl + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", minIdle=" + minIdle +
                ", maxPoolSize=" + maxPoolSize +
                ", connectionTimeout=" + connectionTimeout +
                ", idleTimeout=" + idleTimeout +
                '}';
    }
}

二、使用Environment

/**
 * Environment可以获取classpath下配置的属性值,无需指定具体的配置文件。 不支持yml
 */
@Component
public class UserProperties {

    @Autowired
    private Environment env;

    public String getUserName() {
        return env.getProperty("user.name");
    }

    public String getPassword() {
        return env.getProperty("user.password");
    }
}

三、使用PropertiesLoaderUtils

try {
            Properties properties = PropertiesLoaderUtils.loadAllProperties("config.properties");
            System.out.println(properties.getProperty("user.name"));
        } catch (IOException e) {
            e.printStackTrace();
        }

 

posted @ 2020-11-24 09:32  codedot  阅读(1723)  评论(0编辑  收藏  举报