版權聲明:本文爲博主原創文章,未經博主允許不得轉載。
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