您的位置:首页 > 编程语言 > Java开发

Spring Boot入门教程-数据源外部配置

2017-08-30 15:15 399 查看
在实际项目中,测试环境与线上环境是分开的,数据库也是分开的,前边关于mybatis集成时,数据源是在application.properties中配置,这样如果从测试环境转到线上环境就不得不每次都去修改,稍有不慎就容易出错,那样后果就惨了。所以我们就要考虑吧数据源的配置挪到外边,从项目中获取相关配置,来自定义数据源。

1.首先在磁盘上创建件配置文件 datasource-config.xml,账号密码等数据库连接信息自行修改

<?xml version="1.0" encoding="UTF-8"?>
<config>
<!-- 数据源配置 -->
<data-source>
<db-host>localhost</db-host>
<db-port>3306</db-port>
<username>username</username>
<password>password</password>
<db-name>db-name</db-name>-->

<driver-class-name>com.mysql.jdbc.Driver</driver-class-name>
<db-protocol>jdbc:mysql:</db-protocol>
<db-param>?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true</db-param>
<max-active>50</max-active>
<max-idle>30</max-idle>
<max-wait>100</max-wait>
<initial-size>5</initial-size>
<pool-prepared-statements>true</pool-prepared-statements>
<validation-query>select 1 from dual</validation-query>
<remove-abandoned>true</remove-abandoned>
<remove-abandoned-timeout>150</remove-abandoned-timeout>
<test-while-idle>true</test-while-idle>
<time-between-eviction-runs-millis>3000</time-between-eviction-runs-millis>
<min-evictable-idle-time-millis>5200</min-evictable-idle-time-millis>
<default-autocommit>true</default-autocommit>
</data-source>
</collectmail-config>


2.在resource下创建文件夹config,并创建config.propertie文件,添加

config.location=D\:\\etc\\tomcm\\datasource-config.xml #配置文件路径 只是我的,用的话自行修改


3.添加之前写好的配置文件工具类
/**
* 配置工具类   获取配置信息,可以更换配置文件的路径名字,来获取不同文件内的内容
*
*/
public class PropertiesUtil {

public static Properties loadProperties(String properties) throws Exception {
Properties prop = new Properties();
InputStream propertiesStream = PropertiesUtil.class.getClassLoader().getResourceAsStream(properties);
try {
prop.load(propertiesStream);
} finally {
propertiesStream.close();
}
return prop;
}

public static <T> T getPara(Properties properties, Class<T> type, String key) {
String value = properties.getProperty(key);
return parseValue(type, value);
}

@SuppressWarnings("unchecked")
public static <T> T parseValue(Class<T> type, String value) {
if (Integer.class == type || int.class == type) {
return (T) Integer.valueOf(value);
}
if (Double.class == type || double.class == type) {
return (T) Double.valueOf(value);
}
if (Long.class == type || long.class == type) {
return (T) Long.valueOf(value);
}
if (Boolean.class == type || boolean.class == type) {
return (T) Boolean.valueOf(value);
}
return (T) value;
}

//	public static void main(String[] args) throws Exception {
//		Properties properties = loadProperties("config/config.properties");
//		System.out.println(getPara(properties, boolean.class, "si.printsql"));//false
//		System.out.println(getPara(properties, String.class, "si.page.pagersize"));//10
//	}
}
/**
* 配置工具类   获取配置信息,来获取指定文件内的内容
*
*/

public class ConfigUtil {

private static Log log = LogFactory.getLog(ConfigUtil.class);
//需要解析的properties文件
private static String propertiesUrl = "config/config.properties";

private static Properties prop = null;

private static Configuration config = null;

static{
init();
}

private static void init(){
prop = new Properties();
InputStream in = null;
try {
in = PropertiesUtil.class.getClassLoader().getResourceAsStream(propertiesUrl);
prop.load(in);
System.out.println(prop.getProperty("config.location"));
config = new XMLConfiguration(prop.getProperty("config.location"));
} catch (IOException e) {
log.error(e.getMessage(),e);
} catch (ConfigurationException e) {
e.printStackTrace();
}  finally{
if(in!=null){
try {
in.close();
} catch (IOException e) {
log.error(e.getMessage(),e);
in = null;
}
}
}

}

/**
* 获得String类型的属性值
*
* @param key
* @return
*/
public static String getString(String key){
return config==null?null:config.getString(key);
}

/**
* 获得int类型的属性值
*
* @param key
* @return
*/
public static int getInt(String key){
return config==null?null:config.getInt(key);
}

/**
* 获得boolean类型的属性值
*
* @param key
* @return
*/
public static boolean getBoolean(String key){
return config==null?null:config.getBoolean(key);
}
//
//	public static void main(String[] args) throws Exception {
//		System.out.println(ConfigUtil.getString("data-source.db-host"));
//	}
}

pom.xml中需要加入依赖

<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.2</version>
</dependency>


4.自定义数据源

@Configuration
@Component
public class DataSource extends org.apache.commons.dbcp.BasicDataSource {

public DataSource() {
super();

this.setDriverClassName(ConfigUtil
.getString("data-source.driver-class-name"));
this.setUrl(ConfigUtil.getString("data-source.db-protocol") + "//"
+ ConfigUtil.getString("data-source.db-host") + ":"
+ ConfigUtil.getString("data-source.db-port") + "/"
+ ConfigUtil.getString("data-source.db-name")
+ ConfigUtil.getString("data-source.db-param"));
this.setUsername(ConfigUtil.getString("data-source.username"));
this.setPassword(ConfigUtil.getString("data-source.password"));
this.setMaxActive(ConfigUtil.getInt("data-source.max-active"));
this.setMaxIdle(ConfigUtil.getInt("data-source.max-idle"));
this.setMaxWait(ConfigUtil.getInt("data-source.max-wait"));
this.setInitialSize(ConfigUtil.getInt("data-source.initial-size"));
this.setPoolPreparedStatements(ConfigUtil.getBoolean("data-source.pool-prepared-statements"));
this.setValidationQuery(ConfigUtil.getString("data-source.validation-query"));
this.setRemoveAbandoned(ConfigUtil.getBoolean("data-source.remove-abandoned"));
this.setRemoveAbandonedTimeout(ConfigUtil.getInt("data-source.remove-abandoned-timeout"));
this.setTestWhileIdle(ConfigUtil.getBoolean("data-source.test-while-idle"));
this.setTimeBetweenEvictionRunsMillis(ConfigUtil.getInt("data-source.time-between-eviction-runs-millis"));
this.setMinEvictableIdleTimeMillis(ConfigUtil.getInt("data-source.min-evictable-idle-time-millis"));
this.setDefaultAutoCommit(ConfigUtil.getBoolean("data-source.default-autocommit"));
}
}
5.将 application.properties中原来的数据源去掉,添加
spring.datasource.type=com.example.demo.datasource.DataSource #自定义数据源位置


6.启动项目,请求 之前写好的接口 http://localhost:8080/getPage

@RequestMapping("getPage")
@ResponseBody
public List<User> getByPage() {
PageHelper.startPage(1, 3);//页数 每页数据数
return userService.getByPage();
}



数据获取成功
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: