在需要管理的服务器比较多的时候,我们需要对项目的数据库做统一的管理。但是按照我以往的小白经验数据库的配置是这样的
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbcDriver}" /> <property name="url" value="${jdbcUrl}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> <property name="initialSize" value="${initialSize}"></property> <property name="maxActive" value="${maxActive}"></property> <property name="maxIdle" value="${maxIdle}"></property> <property name="minIdle" value="${minIdle}"></property> <property name="maxWait" value="${maxWait}"></property> </bean>
$符号读取的是本项目的配置文件,如果在项目之外如何读取到呢,还有从数据库取,无从谈起。
所以要达到这种目的,就需要在读取spring配置文件的之前,就把自己配置的值读取到,然后注入到jdbc配置中。
首先要说$号,这个我们常在配置文件中使用的符号:
众所周知,$符号我们使用的很多,可以直接获取设定好的配置文件中的值,类似上面的配置,要取到jdbc参数我们只需要在
一、spring加载时,引入配置文件路径
<!--数据库配置--> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> <value>classpath:global.properties</value> </list> </property> </bean>
二、配置文件中加入键值对
username=root password=root jdbcDriver=com.mysql.jdbc.Driver jdbcUrl=jdbc:mysql://127.0.0.1:3306/test_st?useUnicode=true&characterEncoding=utf-8 initialSize=0 maxActive=20 maxIdle=20 minIdle=1 maxWait=60000
另外就是#号符,百度上没有找到肯定的答案。根据个人理解和@value+mybaties中的#号理解,推断为:
取得某个对象中的某些属性,用java语言的.符号模式获取。
这里的对象可以是文件、Object类型,根据以往经验的@Value取值做法@value("#{jdbcProperties[jdbc.username]}")
获取jdbcProperties文件中jdbc对象的username的值。
所以为了达成我们的灵活配置目的,可以在spring加载配置文件之前将配置从项目外 或者 数据库中读取到存入某个
对象中,然后使用#符号注入到jdbc中,即可达成目的。
一、创建bean,在bean实例化之前设置bean的属性
<bean id="serverConfig" class="com.zmz.common.ServerConfig"></bean>
二、设置bean属性
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * 不使用应用内的配置文件,而使用应用外的 * 这样每次替换不需要反复修改配置文件, * 其次,所有的配置文件放在固定的地方,方便管理 */ @Component public class ServerConfig { @Value("${configDirName}") private String appId; //配置文件的前缀名称 @Value("${jdbcUrl}") private String jdbcUrl; @Value("${username}") private String user; @Value("${password}") private String password; @Value("${jdbcPath}") private String jdbcPath; public ServerConfig() { } @PostConstruct public void init() { // setAppId("agent_account"); // PrintHelper.println("*******************************server unique name:" + appId+" ********************************"); String path = jdbcPath + "/" + appId + ".properties"; Resource resource = new FileSystemResource(path); InputStream is = null; if (resource.isReadable()) { Properties properties = new Properties(); try { is = resource.getInputStream(); properties.load(is); jdbcUrl = properties.getProperty("jdbcUrl"); user = properties.getProperty("username"); password = properties.getProperty("password"); if (is != null) { is.close(); } } catch (IOException e) { e.printStackTrace(); } } else { // PrintHelper.println(appId + " server config resource can not read from out directory"); } } public String getJdbcUrl() { return jdbcUrl; } public void setJdbcUrl(String jdbcUrl) { this.jdbcUrl = jdbcUrl; } public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getAppId() { return appId; } public void setAppId(String appId) { this.appId = appId; } public String getJdbcPath() { return jdbcPath; } public void setJdbcPath(String jdbcPath) { this.jdbcPath = jdbcPath; } }
三、取值
<property name="url" value="#{serverConfig.jdbcUrl}" /> <property name="username" value="#{serverConfig.user}" /> <property name="password" value="#{serverConfig.password}" />
四、改为数据库模式:
不得不说一句,在我开始记录这篇随笔时,想象的时候把读取文件这一段改为读取数据库就可以了。但是突然发现我们
做这一段的本身目的就是为了配置数据库,所以不能达到目的。
猜想的是
一、应该会利用项目的启动顺序对某个配置文件写入值,然后使用上述方法读取值
二、sql语句直接带入数据库地址
当然只是猜想,希望有大神来补充下。