灵活的项目外(可配置文件,可数据库)jdbc配置

在需要管理的服务器比较多的时候,我们需要对项目的数据库做统一的管理。但是按照我以往的小白经验数据库的配置是这样的

<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属性

/**
 * 不使用应用内的配置文件,而使用应用外的
 * 这样每次替换不需要反复修改配置文件,
 * 其次,所有的配置文件放在固定的地方,方便管理
 */
@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;
    }

}
bean实体

三、取值

<property name="url" value="#{serverConfig.jdbcUrl}" />
		<property name="username" value="#{serverConfig.user}" />
		<property name="password" value="#{serverConfig.password}" />

  

四、改为数据库模式:

不得不说一句,在我开始记录这篇随笔时,想象的时候把读取文件这一段改为读取数据库就可以了。但是突然发现我们

做这一段的本身目的就是为了配置数据库,所以不能达到目的。

猜想的是   

一、应该会利用项目的启动顺序对某个配置文件写入值,然后使用上述方法读取值

二、sql语句直接带入数据库地址

当然只是猜想,希望有大神来补充下。

原文地址:https://www.cnblogs.com/mzyy/p/8110390.html