1、業務模塊與數據模塊分離在實際開發中,我們項目的架構業務模塊和數據模塊是分離的,舉個例子,假設我們的項目有"人員管理模塊"和"酒店管理模塊"兩個模塊,按照上一章的介紹,我們會建立下圖所示的項目結構:其中,人員管理模塊的controller、service、dao、mapper都在一個項目中,而在實...
1、業務模塊與數據模塊分離
在實際開發中,我們項目的架構業務模塊和數據模塊是分離的,舉個例子,假設我們的項目有"人員管理模塊"和"酒店管理模塊"兩個模塊,按照上一章的介紹,我們會建立下圖所示的項目結構:
其中,人員管理模塊的controller、service、dao、mapper都在一個項目中,而在實際使用中,我們會將數據模塊分離出來,即將以上兩個子模塊的service、dao、mapper拿出來,放在一個子項目中,形成如下的項目結構:
註意以下幾點:
- 包的命名最好是com.xxx.mapper.user和不是com.xxx.user.mapper,前者在spring.xml中配置mybatis時更方便,具體見spring.xml的中的註釋
- 在controller那一層的項目是需要部署的,即是war,而下邊的數據模塊是作為war的一個jar,所以在war層的pom.xml需要將下邊的數據模塊作為一個jar來引入到項目中
- service層到底是放在業務模塊處還是放在數據模塊處,這個根據需求而定,一般而言,都放在數據模塊處,方便彼此service的調用,如userService調用hotelService,如果這個時候把兩個service分別放在各自的業務模塊層中,相互的調用就要通過RPC了,當然,有的時候可能有些與其他模塊都不調用的service放在war層可能會好一些。
- 將來編寫的緩存模塊類、通用模塊類、RPC工具類等都會作為jar被war層調用。
2、實現
我將上一章的項目做了修改,將ssmm項目改成了userManagement項目,並將userManagement項目實現了業務模塊和數據模塊的分離,具體的操作參照第一章和第二章的相關內容,這裡直接給出項目結構和各個文件。
2.1、項目結構
2.2、代碼實現
2.2.1、ssmm0
pom.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>com.xxx</groupId> 8 <artifactId>ssmm0</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 11 <name>ssmm0</name> 12 <packaging>pom</packaging><!-- 父模塊 --> 13 14 <!-- 管理子模塊 --> 15 <modules> 16 <module>userManagement</module><!-- 具體業務1-人員管理系統 --> 17 <module>data</module><!-- 封裝數據操作 --> 18 </modules> 19 20 <properties> 21 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 22 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 23 </properties> 24 25 <!-- dependencyManagement不會引入實際的依賴,只是作為一個依賴池,供其和其子類使用 --> 26 <dependencyManagement> 27 <dependencies> 28 <!-- json --> 29 <dependency> 30 <groupId>com.alibaba</groupId> 31 <artifactId>fastjson</artifactId> 32 <version>1.1.39</version> 33 </dependency> 34 <!-- servlet --> 35 <dependency> 36 <groupId>javax.servlet</groupId> 37 <artifactId>javax.servlet-api</artifactId> 38 <version>3.0.1</version> 39 <scope>provided</scope> 40 </dependency> 41 <!-- spring --> 42 <dependency> 43 <groupId>org.springframework</groupId> 44 <artifactId>spring-core</artifactId> 45 <version>3.2.6.RELEASE</version> 46 </dependency> 47 <dependency> 48 <groupId>org.springframework</groupId> 49 <artifactId>spring-beans</artifactId> 50 <version>3.2.6.RELEASE</version> 51 </dependency> 52 <dependency> 53 <groupId>org.springframework</groupId> 54 <artifactId>spring-context</artifactId> 55 <version>3.2.6.RELEASE</version> 56 </dependency> 57 <dependency> 58 <groupId>org.springframework</groupId> 59 <artifactId>spring-web</artifactId> 60 <version>3.2.6.RELEASE</version> 61 </dependency> 62 <dependency> 63 <groupId>org.springframework</groupId> 64 <artifactId>spring-webmvc</artifactId> 65 <version>3.2.6.RELEASE</version> 66 </dependency> 67 <!-- 這個是使用velocity的必備包 --> 68 <dependency> 69 <groupId>org.springframework</groupId> 70 <artifactId>spring-context-support</artifactId> 71 <version>3.2.6.RELEASE</version> 72 </dependency> 73 <!-- mysql --> 74 <dependency> 75 <groupId>mysql</groupId> 76 <artifactId>mysql-connector-java</artifactId> 77 <version>5.1.27</version> 78 <scope>runtime</scope> 79 </dependency> 80 <!-- 數據源 --> 81 <dependency> 82 <groupId>org.apache.tomcat</groupId> 83 <artifactId>tomcat-jdbc</artifactId> 84 <version>7.0.47</version> 85 </dependency> 86 <!-- mybatis --> 87 <dependency> 88 <groupId>org.mybatis</groupId> 89 <artifactId>mybatis</artifactId> 90 <version>3.1.1</version> 91 </dependency> 92 <dependency> 93 <groupId>org.mybatis</groupId> 94 <artifactId>mybatis-spring</artifactId> 95 <version>1.1.1</version> 96 </dependency> 97 <!-- velocity --> 98 <dependency> 99 <groupId>org.apache.velocity</groupId> 100 <artifactId>velocity</artifactId> 101 <version>1.5</version> 102 </dependency> 103 <dependency> 104 <groupId>velocity-tools</groupId> 105 <artifactId>velocity-tools-generic</artifactId> 106 <version>1.2</version> 107 </dependency> 108 <!-- 用於加解密 --> 109 <dependency> 110 <groupId>commons-codec</groupId> 111 <artifactId>commons-codec</artifactId> 112 <version>1.7</version> 113 </dependency> 114 <dependency> 115 <groupId>org.bouncycastle</groupId> 116 <artifactId>bcprov-jdk15on</artifactId> 117 <version>1.47</version> 118 </dependency> 119 <!-- 集合工具類 --> 120 <dependency> 121 <groupId>org.apache.commons</groupId> 122 <artifactId>commons-collections4</artifactId> 123 <version>4.0</version> 124 </dependency> 125 <!-- http --> 126 <dependency> 127 <groupId>org.apache.httpcomponents</groupId> 128 <artifactId>httpclient</artifactId> 129 <version>4.2.6</version> 130 </dependency> 131 </dependencies> 132 </dependencyManagement> 133 134 <!-- 引入實際依賴 --> 135 <dependencies> 136 <!-- json --> 137 <dependency> 138 <groupId>com.alibaba</groupId> 139 <artifactId>fastjson</artifactId> 140 </dependency> 141 <!-- spring --> 142 <dependency> 143 <groupId>org.springframework</groupId> 144 <artifactId>spring-core</artifactId> 145 </dependency> 146 <dependency> 147 <groupId>org.springframework</groupId> 148 <artifactId>spring-beans</artifactId> 149 </dependency> 150 <dependency> 151 <groupId>org.springframework</groupId> 152 <artifactId>spring-context</artifactId> 153 </dependency> 154 <!-- 集合工具類 --> 155 <dependency> 156 <groupId>org.apache.commons</groupId> 157 <artifactId>commons-collections4</artifactId> 158 </dependency> 159 </dependencies> 160 161 <build> 162 <resources> 163 <!-- 164 這裡配置了這一塊兒true,才可以讓指定文件(這裡是src/main/resources/*.xml)讀到pom.xml中的配置信息 , 165 值得註意的是,如果src/main/resources下還有其他文件,而你不想讓其讀pom.xml, 166 你還必須得把src/main/resources下的其餘文件再配置一遍,配置為false(不可讀pom.xml), 167 如下邊的註釋那樣,否則,會報這些文件(在這裡,就是*.properties)找不到的錯誤 168 --> 169 <resource> 170 <directory>src/main/resources</directory> 171 <filtering>true</filtering> 172 <includes> 173 <include>*.xml</include> 174 </includes> 175 </resource> 176 <!-- <resource> 177 <directory>src/main/resources</directory> 178 <filtering>false</filtering>可以讀 ,若改為false就是不可讀 179 <includes> 180 <include>*.properties</include> 181 </includes> 182 </resource> --> 183 </resources> 184 </build> 185 186 <!-- 187 profiles可以定義多個profile,然後每個profile對應不同的激活條件和配置信息,從而達到不同環境使用不同配置信息的效果 188 註意兩點: 189 1)<activeByDefault>true</activeByDefault>這種情況表示伺服器啟動的時候就採用這一套env(在這裡,就是prod) 190 2)當我們啟動伺服器後,想採用開發模式,需切換maven的env為dev,如果env的配置本身就是dev,需要將env換成rc或prod,點擊apply,然後再將env切換成dev,點擊apply才行 191 --> 192 <profiles> 193 <!-- 開發env --> 194 <profile> 195 <id>dev</id> 196 <activation> 197 <activeByDefault>false</activeByDefault> 198 <property> 199 <name>env</name> 200 <value>dev</value> 201 </property> 202 </activation> 203 <properties> 204 <env>dev</env> 205 206 <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName> 207 <!-- 208 對於jdbc.url中內容的配置,如果需要配置 &時,有兩種方法: 209 1)如下邊這樣,使用<![CDATA[XXX]]>包起來 210 2)使用jdbc.properties文件來讀取此pom.xml,然後spring.xml再讀取jdbc.properties文件 211 顯然,前者更方便,而且還省了一個jdbc.properties的文件,但是,有的時候,還是會用後者的; 212 在使用後者的時候,註意三點: 213 1)需要修改上邊的build中的內容 214 2)需要在spring.xml中配置<context:property-placeholder location="classpath:jdbc.properties"/> 215 3)jdbc.properties與spring.xml必須在一個項目中,不能將jdbc.properties放在ssmm0-data項目中,否則切換env就不能用了 216 --> 217 <jdbc.url><![CDATA[jdbc:mysql://127.0.0.1:3306/blog?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8]]></jdbc.url> 218 <jdbc.username>root</jdbc.username> 219 <jdbc.password>123456</jdbc.password> 220 </properties> 221 </profile> 222 <!-- 預上線env --> 223 <profile> 224 <id>rc</id> 225 <activation> 226 <activeByDefault>false</activeByDefault> 227 <property> 228 <name>env</name> 229 <value>rc</value> 230 </property> 231 </activation> 232 <properties> 233 <env>rc</env> 234 235 <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName> 236 <!-- 假設的一個地址 --> 237 <jdbc.url><![CDATA[jdbc:mysql://10.10.10.100:3306/blog?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8]]></jdbc.url> 238 <jdbc.username>root2</jdbc.username> 239 <jdbc.password>1234562</jdbc.password> 240 </properties> 241 </profile> 242 <!-- 線上env --> 243 <profile> 244 <id>prod</id> 245 <activation> 246 <activeByDefault>true</activeByDefault> 247 <property> 248 <name>env</name> 249 <value>prod</value> 250 </property> 251 </activation> 252 <properties> 253 <env>prod</env> 254 255 <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName> 256 <!-- 假設的一個地址 --> 257 <jdbc.url><![CDATA[jdbc:mysql://99.99.99.999:3307/blog?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8]]></jdbc.url> 258 <jdbc.username>sadhijhqwui</jdbc.username> 259 <jdbc.password>zxczkchwihcznk=</jdbc.password> 260 </properties> 261 </