zoukankan      html  css  js  c++  java
  • 灵活的项目外(可配置文件,可数据库)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语句直接带入数据库地址

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

  • 相关阅读:
    作业07-Java GUI编程
    作业06-接口、内部类
    作业05-继承、多态、抽象类与接口
    作业14-数据库
    作业13-网络
    作业12-流与文件
    作业11-多线程
    作业10-异常
    作业09-集合与泛型
    作业08-集合
  • 原文地址:https://www.cnblogs.com/mzyy/p/8110390.html
Copyright © 2011-2022 走看看