Spring-boot中利用外部配置文件生成數據源

 

Spring-boot中利用外部配置文件生成數據源

 919人閱讀 評論(2) 收藏 舉報
 分類:
 

目錄(?)[+]

Spring data 提供了一種很強大的JPA(主要是不需要給方法寫implements) 
Spring boot則提供了方便的自動配置。 netgloo 的例子 如何只利用一個單一的配置文件 application.properties 數據訪問功能。 
不過有時,你需要的是datasource是外部可配置的,而不是寫死在project中的。 
所以,這裏博主便提供一種通過外部配置文件產生數據源來替換Spring boot自動生成的數據源。

第一步

在工程中生成一個Spring boot默認需要的配置文件: src/main/resources/application.properties

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;">    spring<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.datasource</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.url</span> = jdbc:postgresql://localhost:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5432</span>/bmsc
    spring<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.datasource</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.username</span> = aere
    spring<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.datasource</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.password</span> = aerexu

    spring<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.datasource</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.testWhileIdle</span> = true
    spring<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.datasource</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.validationQuery</span> = SELECT <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>

    spring<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.jpa</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.properties</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.datasource</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.driver</span>-class-name=org<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.postgresql</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Driver</span>
    spring<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.jpa</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.properties</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.hibernate</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.dialect</span> = org<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.hibernate</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.dialect</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.PostgreSQL</span>9Dialect

    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># Show or not log for each sql query</span>
    spring<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.jpa</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.show</span>-sql = true

    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># Hibernate ddl auto (create, create-drop, update)</span>
    spring<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.jpa</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.hibernate</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.ddl</span>-auto = update

    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># Naming strategy</span>
    spring<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.jpa</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.hibernate</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.naming</span>-strategy = org<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.hibernate</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.cfg</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.ImprovedNamingStrategy</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li></ul>

第二步

在其他路徑生成一個需要的配置文件C:\Users\test\Workplace\config\SpringAll\datasource.properties

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;">spring<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.datasource</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.url</span> = jdbc:postgresql://<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192.168</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.99</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.100</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5432</span>/bmsc
spring<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.datasource</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.username</span> = aere
spring<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.datasource</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.password</span> = aerexu</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

最後一步

生成一個Spring的配置類 PersistenceJPAConfig 

<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;">    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">package</span> com.aere.spring.all.config.jpa;

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Imports ...</span>

    <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Configuration</span>
    <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@ComponentScan</span>
    <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@PropertySource</span>(value = {<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"classpath:/application.properties"</span>,
            <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"file:/C:\\Users\\test\\Workplace\\config\\SpringAll\\datasource.properties"</span>},
            ignoreResourceNotFound = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>)
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">PersistenceJPAConfig</span> {</span>

        <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Bean</span>
        <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@ConfigurationProperties</span>(prefix=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"spring.datasource"</span>)
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> DataSource <span class="hljs-title" style="box-sizing: border-box;">dataSource</span>() {
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> DriverManagerDataSource();
        }
    }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul>

你可能會注意到在@PropertySource中有兩個配置文件。當然,實際有限的只會是一個。如果兩個文件都存在,則後面一個文件有效;如果只有一個文件存在,當然是存在的那個有限。這麼做的目的的便於在開發中使用工程中的默認的配置文件,而在測試、部署中利用外部的配置文件。

好啦,這就是所有步驟了。是不是很簡單,只用了一些小技巧?無論如何,簡潔有效的代碼纔是最好的。

另外:

如果你需要顯示出來的密碼是加密過的,那你可以自定義一個Datasource類繼承上面的 DriverManagerDataSource. 如下所示:

<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">EncryptedDriverManagerDataSource</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">extends</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">DriverManagerDataSource</span>{</span>
    ...
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-title" style="box-sizing: border-box;">EncryptedDriverManagerDataSource</span>(String url, String username, String password) {
        setUrl(url);
        setUsername(username);
        String decryptedPass = someDecryptMethod(password);
        setPassword(decryptedPass);
    }
    ...
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>

把上面類 PersistenceJPAConfig 中 DriverManagerDataSource 替換成 EncryptedDriverManagerDataSource

發佈了21 篇原創文章 · 獲贊 10 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章