上一个教程我们已经讲如何初始化启动我们的Spring Boot应用,本次教程我给大家讲解下如何读取置数据方式更适合,简洁;如没看上一篇教程的同学可看点击该链接【Spring Boot从入门到进阶教程系列 -- 外部Tomcat多方式启动,加密解密配置数据】
SpringBoot读取配置数据有几种方式
1.方式一,这次写法系统会依据prefix前缀自动注入配置数据到数据实体变量,这种方式不错,但是存在缺陷,我们编写的PropertyPlaceholderConfigurer扩展字段会无效,所以如果只是单纯的读取配置而不需要额外操作时可使用这方式最简洁优雅
/** * @author shadow */ @Component @ConfigurationProperties(prefix = "spring.datasource") public class DbConfig { private String database; private String url; private String username; private String password; private String driverClassName; private int initialSize; private int minIdle; private int maxActive; private int maxWait; private int timeBetweenEvictionRunsMillis; private int minEvictableIdleTimeMillis; private String validationQuery; private boolean testWhileIdle; private boolean testOnBorrow; private boolean testOnReturn; private String filters; private String logSlowSql; private String mgbXmlLocation; public String getDatabase() { return database; } public void setDatabase(String database) { this.database = database; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } 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 String getDriverClassName() { return driverClassName; } public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; } public int getInitialSize() { return initialSize; } public void setInitialSize(int initialSize) { this.initialSize = initialSize; } public int getMinIdle() { return minIdle; } public void setMinIdle(int minIdle) { this.minIdle = minIdle; } public int getMaxActive() { return maxActive; } public void setMaxActive(int maxActive) { this.maxActive = maxActive; } public int getMaxWait() { return maxWait; } public void setMaxWait(int maxWait) { this.maxWait = maxWait; } public int getTimeBetweenEvictionRunsMillis() { return timeBetweenEvictionRunsMillis; } public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis) { this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; } public int getMinEvictableIdleTimeMillis() { return minEvictableIdleTimeMillis; } public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) { this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; } public String getValidationQuery() { return validationQuery; } public void setValidationQuery(String validationQuery) { this.validationQuery = validationQuery; } public boolean isTestWhileIdle() { return testWhileIdle; } public void setTestWhileIdle(boolean testWhileIdle) { this.testWhileIdle = testWhileIdle; } public boolean isTestOnBorrow() { return testOnBorrow; } public void setTestOnBorrow(boolean testOnBorrow) { this.testOnBorrow = testOnBorrow; } public boolean isTestOnReturn() { return testOnReturn; } public void setTestOnReturn(boolean testOnReturn) { this.testOnReturn = testOnReturn; } public String getFilters() { return filters; } public void setFilters(String filters) { this.filters = filters; } public String getLogSlowSql() { return logSlowSql; } public void setLogSlowSql(String logSlowSql) { this.logSlowSql = logSlowSql; } public String getMgbXmlLocation() { return mgbXmlLocation; } public void setMgbXmlLocation(String mgbXmlLocation) { this.mgbXmlLocation = mgbXmlLocation; } }
2.方式二,我们通过@Value("${spring.datasource.url}")这样的方式读取PropertyPlaceholderConfigurer.properties配置数据集合,本种方式是可以适应各种应用场景,可惜不够优雅,所以如果你的配置数据比较复杂,需要额外多的扩展机制,可以考虑本种方式
/** * @author shadow */ @Component public class DbConfig { @Value("${spring.datasource.database}") private String database; @Value("${spring.datasource.url}") private String url; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.driverClassName}") private String driverClassName; @Value("${spring.datasource.initialSize}") private int initialSize; @Value("${spring.datasource.minIdle}") private int minIdle; @Value("${spring.datasource.maxActive}") private int maxActive; @Value("${spring.datasource.maxWait}") private int maxWait; @Value("${spring.datasource.timeBetweenEvictionRunsMillis}") private int timeBetweenEvictionRunsMillis; @Value("${spring.datasource.minEvictableIdleTimeMillis}") private int minEvictableIdleTimeMillis; @Value("${spring.datasource.validationQuery}") private String validationQuery; @Value("${spring.datasource.testWhileIdle}") private boolean testWhileIdle; @Value("${spring.datasource.testOnBorrow}") private boolean testOnBorrow; @Value("${spring.datasource.testOnReturn}") private boolean testOnReturn; @Value("${spring.datasource.filters}") private String filters; @Value("${spring.datasource.logSlowSql}") private String logSlowSql; @Value("${spring.datasource.mgbXmlLocation}") private String mgbXmlLocation; public String getDatabase() { return database; } public void setDatabase(String database) { this.database = database; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } 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 String getDriverClassName() { return driverClassName; } public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; } public int getInitialSize() { return initialSize; } public void setInitialSize(int initialSize) { this.initialSize = initialSize; } public int getMinIdle() { return minIdle; } public void setMinIdle(int minIdle) { this.minIdle = minIdle; } public int getMaxActive() { return maxActive; } public void setMaxActive(int maxActive) { this.maxActive = maxActive; } public int getMaxWait() { return maxWait; } public void setMaxWait(int maxWait) { this.maxWait = maxWait; } public int getTimeBetweenEvictionRunsMillis() { return timeBetweenEvictionRunsMillis; } public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis) { this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; } public int getMinEvictableIdleTimeMillis() { return minEvictableIdleTimeMillis; } public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) { this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; } public String getValidationQuery() { return validationQuery; } public void setValidationQuery(String validationQuery) { this.validationQuery = validationQuery; } public boolean isTestWhileIdle() { return testWhileIdle; } public void setTestWhileIdle(boolean testWhileIdle) { this.testWhileIdle = testWhileIdle; } public boolean isTestOnBorrow() { return testOnBorrow; } public void setTestOnBorrow(boolean testOnBorrow) { this.testOnBorrow = testOnBorrow; } public boolean isTestOnReturn() { return testOnReturn; } public void setTestOnReturn(boolean testOnReturn) { this.testOnReturn = testOnReturn; } public String getFilters() { return filters; } public void setFilters(String filters) { this.filters = filters; } public String getLogSlowSql() { return logSlowSql; } public void setLogSlowSql(String logSlowSql) { this.logSlowSql = logSlowSql; } public String getMgbXmlLocation() { return mgbXmlLocation; } public void setMgbXmlLocation(String mgbXmlLocation) { this.mgbXmlLocation = mgbXmlLocation; } }
3.方式三,我们可以直接注入Environment对象示例并读取properties对象属性,与方式二的本质差不多,我们不需要编写对应字段的模型对象,但是对于程序可阅读性不好友,复用率不高
/** * @author shadow */ @Component public class DbConfig { @Autowired private Environment environment; public String getDatabase() { return environment.getProperty("spring.datasource.databse"); } }
4.方式四,通过系统启动时候初始化Listener,使用PropertiesLoaderUtils工具类读取指定配置文件并获得Properties配置对象,我们可以随时随地使用该对象的属性,这种方式比较少用,针对比较自定义的配置数据可使用该方式
public class PropertiesListener implements ApplicationListener<ApplicationStartedEvent> { @Override public void onApplicationEvent(ApplicationStartedEvent event) { try { Properties properties = PropertiesLoaderUtils.loadAllProperties("classpath:application.properties"); System.out.println(properties); } catch (IOException e) { e.printStackTrace(); } } }
针对以上四种配置数据加载方式,我比较建议是第二种,因为比较符合我们以往spring老方式的读取以及扩展(比如zookeeper数据加载),如简单无须任何变更配置的则使用第一种最简洁优雅,至于其他的方式大家都应该有自己的理解,怎么选用可根据你的实际项目配置加载方式最好,最后感谢大家的阅读.