Java開發進銷存管理系統(二)

Java團長_發表於2018-11-26

四、底層架構設計

  

在進行進銷存系統的設計和編碼之前,首先設計一個自己的底層框架,這個底層框架在之後可以作為其它具體專案開發的一個基礎,從而不必每次開發專案時,都去做很多重複的工作。這個底層框架主要包括一個開發的規範,以及一些通用的工具類等,更重要的是分類別引入各個框架,如Spring、Hibernate、各個配置檔案等。同時,如果以後在開發中,增加的一些新功能,還可以往這個底層中新增,不斷的去完善。


1. 規範

  

在進行框架設計之前,為了使軟體開發過程順暢、提高程式碼的可靠性,可讀性和可維護性等,首先需要確定的就是開發規範了,俗話說,沒有規矩不成方圓,軟體開發亦是如此。下面列出一些簡單的需要遵守的規範。

  

1.1 基礎規範

  

首先需要遵守的是一些基礎規範。一般來說,公司會將域名作為所有命名的一個基礎,比如檔名、包名等等。因此我申請了一個域名[www.lyyzoo.com]作為個人域名。然後將D:/lyyzoo-repo作為開發的根目錄,即個人程式碼倉庫,以後所有的專案都會建到這個目錄下。所有的專案開發使用maven來管理專案,因此目錄結構是標準的maven規範目錄。

  

maven約定的目錄結構:


  640?wx_fmt=png

  

1.2 程式碼規範

  

① 命名  

    

  • 所有的命名需要見名之意,儘量保證通過變數名得知變數的含義,需要註釋的地方儘量新增註釋。

  • 包命名全小寫,通過域名倒寫+模組的形式,如:com.lyyzoo.service

  • 類命名採用Pascal名法,大寫字母開頭,每個單詞首字母大寫。

  • 方法名採用Camel命名法,小寫字母開頭,每個單詞首字母小寫;getter和setter使用Lombok自動生成,只需新增@Data註解即可。

  • 變數名採用Camel命名法,小寫字母開頭,每個單詞首字母大寫。變數名不宜過長,可採用首字母縮寫的形式,但要見名之意。

  • 常量名全大寫,每個單詞之間使用”_”分隔。

  

② 分層

    

專案以功能模組劃分,不同專案建立不同的工程,使用maven的依賴進行管理。包的基本分層有controller(控制層)、service(業務層)、dao(資料訪問層)、entity(模型層)。


2. 架構設計

  

2.1 模組結構

  

整個專案的底層著重是一些通用的、基礎的東西,整合到一起,以便於以後重用。首先,建立一個名為lyyzoo的maven工程,lyyzoo將作為底層的根目錄。lyyzoo下有兩個主要的子模組,分別為lyyzoo-base和lyyzoo-starter,lyyzoo-base是基礎模組,用於一些簡單的Java及JavaEE程式;lyyzoo-starter則是JavaEE相關,會依賴於lyyzoo-base,同時引入了Spring、Hibernate等第三方框架。然後在各個模組中新增具體的子模組。以後開發中需要用到哪個模組,在依賴中新增那個模組即可。

  

底層模組結構圖:

  640?wx_fmt=png

  

以下是各個POM之間的關係:

  

① lyyzoo > pom.xml

  640?wx_fmt=png

  

② lyyzoo-base > pom.xml

  640?wx_fmt=png

  

③ lyyzoo-starter > pom.xml

  640?wx_fmt=png

  

2.2 依賴管理

  

結構建好後,就需要進行一些詳細的依賴配置工作了,lyyzoo是所有模組的父類,所以在lyyzoo中需要新增公用的屬性、依賴管理、maven外掛等。

  

首先將所有的版本號提出來,放到<properties></properties>裡,這樣一旦需要切換到另一個版本時,就可以只改個版本號就達到目的了。其中列出了一些屬性如下:包括底層的版本、Java版本、Spring、Hibernate的版本等等。


<properties>
2   <!-- Global -->
3   <lyyzoo.version>1.0-SNAPSHOT</lyyzoo.version>
4   <java.version>1.8</java.version>
5   <maven.compiler.source>${java.version}</maven.compiler.source>
6   <maven.compiler.target>${java.version}</maven.compiler.target>
7   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
8   <!-- lombok -->
9   <lombok.version>1.16.14</lombok.version>
10   <!-- log -->
11   <slf4j.version>1.7.7</slf4j.version>
12   <logback.version>1.1.3</logback.version>
13   <!-- jdbc -->
14   <mysql.version>5.1.38</mysql.version>
15   <!-- http://mvnrepository.com/artifact/com.mchange/c3p0/ -->
16   <c3p0.version>0.9.5.2</c3p0.version>
17   <!-- test -->
18   <junit.version>4.12</junit.version>
19   <!-- servlet -->
20   <servlet.version>3.1.0</servlet.version>
21   <!-- spring -->
22   <spring.version>4.2.6.RELEASE</spring.version>
23   <aspectjrt.version>1.7.3</aspectjrt.version>
24   <aspectjweaver.version>1.7.3</aspectjweaver.version>
25   <!-- hibernate -->
26   <hibernate.version>5.0.1.Final</hibernate.version>
27   <hibernate.jpa.version>1.0.0.Final</hibernate.jpa.version>
28 </properties>


接著,引入依賴管理,在lyyzoo中引入其它專案將會用到的所有三方jar包的依賴,所有的依賴都新增到<dependencyManagement><dependencies></dependencies></dependencyManagement>中,這樣就可以方便的管理所有的jar包了。下面列出引入的一部分jar包,其它的可參考原始碼。

  

① 首先需要引入lyyzoo下的其它模組,如lyyzoo-base-core、lyyzoo-starter-base等模組。


<!-- lyyzoo -->
<dependency>
3   <groupId>com.lyyzoo</groupId>
4   <artifactId>lyyzoo-base-core</artifactId>
5   <version>${lyyzoo.version}</version>
</dependency>
<dependency>
8   <groupId>com.lyyzoo</groupId>
9   <artifactId>lyyzoo-base-data</artifactId>
10   <version>${lyyzoo.version}</version>
11 </dependency>
12 <dependency>
13   <groupId>com.lyyzoo</groupId>
14   <artifactId>lyyzoo-starter-base</artifactId>
15   <version>${lyyzoo.version}</version>
16 </dependency>
17 <dependency>
18   <groupId>com.lyyzoo</groupId>
19   <artifactId>lyyzoo-starter-jpa</artifactId>
20   <version>${lyyzoo.version}</version>
21 </dependency>


② JDBC相關,相關jar包有c3p0,用於作資料庫連線池;mysql驅動包;dbutils,對JDBC進行了簡單的封裝,使用起來簡單方便。


<!-- jdbc -->
<dependency>
3   <groupId>com.mchange</groupId>
4   <artifactId>c3p0</artifactId>
5   <version>${c3p0.version}</version>
</dependency>
<dependency>
8   <groupId>mysql</groupId>
9   <artifactId>mysql-connector-java</artifactId>
10   <version>${mysql.version}</version>
11 </dependency>
12 <dependency>
13   <groupId>commons-dbutils</groupId>
14   <artifactId>commons-dbutils</artifactId>
15   <version>1.5</version>
16 </dependency>


③ 日誌相關:


<!-- log -->
<dependency>
3   <groupId>org.slf4j</groupId>
4   <artifactId>slf4j-api</artifactId>
5   <version>${slf4j.version}</version>
</dependency>
<dependency>
8   <groupId>ch.qos.logback</groupId>
9   <artifactId>logback-classic</artifactId>
10   <version>${logback.version}</version>
11 </dependency>
12 <!-- slf4j -->
13 <dependency>
14   <groupId>org.slf4j</groupId>
15   <artifactId>log4j-over-slf4j</artifactId>
16   <version>${slf4j.version}</version>
17 </dependency>


④ spring相關,包括了spring aop、spring mvc等。


<!-- springframework -->
<dependency>
3   <groupId>org.springframework</groupId>
4   <artifactId>spring-aop</artifactId>
5   <version>${spring.version}</version>
</dependency>
<dependency>
8   <groupId>org.springframework</groupId>
9   <artifactId>spring-aspects</artifactId>
10   <version>${spring.version}</version>
11 </dependency>
12 <dependency>
13   <groupId>org.springframework</groupId>
14   <artifactId>spring-beans</artifactId>
15   <version>${spring.version}</version>
16 </dependency>
17 <dependency>
18   <groupId>org.springframework</groupId>
19   <artifactId>spring-context</artifactId>
20   <version>${spring.version}</version>
21 </dependency>
22 <dependency>
23   <groupId>org.springframework</groupId>
24   <artifactId>spring-context-support</artifactId>
25   <version>${spring.version}</version>
26 </dependency>
27 <dependency>
28   <groupId>org.springframework</groupId>
29   <artifactId>spring-core</artifactId>
30   <version>${spring.version}</version>
31 </dependency>
32 <dependency>
33   <groupId>org.springframework</groupId>
34   <artifactId>spring-jdbc</artifactId>
35   <version>${spring.version}</version>
36 </dependency>
37 <dependency>
38   <groupId>org.springframework</groupId>
39   <artifactId>spring-jms</artifactId>
40   <version>${spring.version}</version>
41 </dependency>
42 <dependency>
43   <groupId>org.springframework</groupId>
44   <artifactId>spring-orm</artifactId>
45   <version>${spring.version}</version>
46 </dependency>
47 <dependency>
48   <groupId>org.springframework</groupId>
49   <artifactId>spring-tx</artifactId>
50   <version>${spring.version}</version>
51 </dependency>
52 <dependency>
53   <groupId>org.springframework</groupId>
54   <artifactId>spring-web</artifactId>
55   <version>${spring.version}</version>
56 </dependency>
57 <dependency>
58   <groupId>org.springframework</groupId>
59   <artifactId>spring-webmvc</artifactId>
60   <version>${spring.version}</version>
61 </dependency>


⑤ hibernate相關:


<dependency>
2   <groupId>org.hibernate</groupId>
3   <artifactId>hibernate-c3p0</artifactId>
4   <version>${hibernate.version}</version>
</dependency>
<dependency>
7   <groupId>org.hibernate.common</groupId>
8   <artifactId>hibernate-commons-annotations</artifactId>
9   <version>${hibernate.version}</version>
10 </dependency>
11 <dependency>
12   <groupId>org.hibernate</groupId>
13   <artifactId>hibernate-core</artifactId>
14   <version>${hibernate.version}</version>
15 </dependency>
16 <dependency>
17   <groupId>org.hibernate</groupId>
18   <artifactId>hibernate-entitymanager</artifactId>
19   <version>${hibernate.version}</version>
20 </dependency>


所有的依賴新增好後,就需要為各個子模組新增具體的依賴了,根據每個子模組的功能,新增相關的依賴,而不是將所有的依賴一次性加入。這樣我們就可以根據自己開發的專案的需要,新增模組依賴,而不是一次性加入所有jar包,避免冗餘,增大專案的體積。下面以lyyzoo-base-data和lyyzoo-starter-jpa為例說明。

  

lyyzoo-base-data模組是基礎資料相關,主要與資料庫打交道,那麼就需要引入mysql驅動、資料庫連線池c3p0等,pom.xml如下:


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

 3     <modelVersion>4.0.0</modelVersion>
4     <parent>
5         <groupId>com.lyyzoo</groupId>
6         <artifactId>lyyzoo-base</artifactId>
7         <version>1.0-SNAPSHOT</version>
8     </parent>
9     <artifactId>lyyzoo-base-data</artifactId>
10     <name>${project.artifactId}</name>
11     <packaging>jar</packaging>
12 
13     <dependencies>
14         <!-- dbutils -->
15         <dependency>
16             <groupId>commons-dbutils</groupId>
17             <artifactId>commons-dbutils</artifactId>
18         </dependency>
19         <!-- jdbc -->
20         <dependency>
21             <groupId>mysql</groupId>
22             <artifactId>mysql-connector-java</artifactId>
23         </dependency>
24         <dependency>
25             <groupId>com.mchange</groupId>
26             <artifactId>c3p0</artifactId>
27         </dependency>
28     <!-- test -->
29         <dependency>
30             <groupId>com.lyyzoo</groupId>
31             <artifactId>lyyzoo-base-test</artifactId>
32             <scope>test</scope>
33         </dependency>
34     </dependencies>
35 </project>


lyyzoo-starter-jpa是Java持久化相關,所以主要引入hibernate相關的依賴,同時,starter-jpa會依賴base-data及starter-base,pom.xml如下:


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

 3     <modelVersion>4.0.0</modelVersion>
4     <parent>
5         <groupId>com.lyyzoo</groupId>
6         <artifactId>lyyzoo-starter</artifactId>
7         <version>1.0-SNAPSHOT</version>
8     </parent>
9     <artifactId>lyyzoo-starter-jpa</artifactId>
10     <name>${project.artifactId}</name>
11     <packaging>jar</packaging>
12 
13     <dependencies>
14         <dependency>
15             <groupId>com.lyyzoo</groupId>
16             <artifactId>lyyzoo-base-data</artifactId>
17         </dependency>
18         <dependency>
19             <groupId>com.lyyzoo</groupId>
20             <artifactId>lyyzoo-starter-base</artifactId>
21         </dependency>
22         <dependency>
23             <groupId>org.hibernate</groupId>
24             <artifactId>hibernate-c3p0</artifactId>
25         </dependency>
26         <dependency>
27             <groupId>org.hibernate.common</groupId>
28             <artifactId>hibernate-commons-annotations</artifactId>
29         </dependency>
30         <dependency>
31             <groupId>org.hibernate</groupId>
32             <artifactId>hibernate-core</artifactId>
33         </dependency>
34         <dependency>
35             <groupId>org.hibernate</groupId>
36             <artifactId>hibernate-ehcache</artifactId>
37         </dependency>
38         <dependency>
39             <groupId>org.hibernate.javax.persistence</groupId>
40             <artifactId>hibernate-jpa-2.1-api</artifactId>
41         </dependency>
42         <dependency>
43             <groupId>org.hibernate</groupId>
44             <artifactId>hibernate-validator</artifactId>
45         </dependency>
46         <dependency>
47             <groupId>com.lyyzoo</groupId>
48             <artifactId>lyyzoo-starter-test</artifactId>
49             <scope>test</scope>
50         </dependency>
51     </dependencies>
52 </project>


2.3 類結構

  

有了前面的基礎之後,接下來進行重點的類結構設計。底層需要做的最重要的工作就是將一些通用的類抽象出來,以便於以後重用,從而提高開發效率。例如返回結果和分頁類的封裝、通用的工具類、JDBC相關的操作等。

  

說明一下,整個底層很大一部分是從之前實習的公司(這個就不說了)直接拿過來的,有些則更改了。相信我拿取的這部分程式碼並不會涉及機密問題,不用於商業用途,僅僅只是學習,應該沒多大問題。

  
(1) lyyzoo-base-core

  

lyyzoo-base-core 目錄結構:

  640?wx_fmt=png

  

lyyzoo-base-core是基礎核心,封裝了返回結果和加入了一些常用的工具類。

  

com.lyyzoo.bean包下封裝了BaseBean和Result,BaseBean是Bean類的一個基礎類,實現了序列化,重寫了toString()方法,如下:


1 package com.lyyzoo.bean;
2 
3 import org.apache.commons.lang3.builder.ToStringBuilder;
4 import org.apache.commons.lang3.builder.ToStringStyle;
5 
6 import java.io.Serializable;
7 
8 /**
9  * BaseBean 實現序列化 <p>
10  *
11  * @author bojiangzhou
12  * @date 2017-03-27
13  */

14 public abstract class BaseBean implements Serializable {
15 
16     /**
17      * ToStringBuilder – 用於輔助實現Object.toString()方法<p>
18      */

19     public String toString() {
20         return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
21     }
22 
23 }


Result則封裝了返回的結果,這裡主要與ExtJs相對應,ExtJs進行ajax請求時,返回success=true,會進入success()方法;返回success=false,會進入failure()方法。同時,封裝了返回訊息、標識、錯誤資訊等,便於前端拿到相應資料。


1 package com.lyyzoo.bean;
2 
3 import lombok.Data;
4 
5 import java.util.Map;
6 
7 /**
8  * 封裝返回結果<p>
9  *
10  * @author bojiangzhou
11  * @date 2017-03-27
12  */

13 @Data
14 public class Result extends BaseBean {
15     private static final long serialVersionUID = 1L;
16 
17     /**
18      * 成功標誌
19      */

20     public boolean success;
21     /**
22      * 返回標示
23      */

24     public Integer code;
25     /**
26      * 相關訊息
27      */

28     public String msg;
29     /**
30      * 相關資料
31      */

32     public Object data;
33     /**
34      * 錯誤詳細
35      */

36     public Map<StringObject> errors;
37 
38     public Result() {
39 
40     }
41 
42     public Result(boolean success) {
43         this.success = success;
44     }
45 
46     public Result(boolean success, Integer code, Object data, String msg) {
47         this(success);
48         this.code = code;
49         this.data = data;
50         this.msg = msg;
51     }
52 
53     public Result(Integer code, Map<StringObject> errors, String msg) {
54         this.success = false;
55         this.code = code;
56         this.errors = errors;
57         this.msg = msg;
58     }
59 
60     public boolean isSuccess() {
61         return this.success;
62     }
63 
64     public boolean hasErrors() {
65         if (this.errors != null && this.errors.size() > 0) {
66             return true;
67         }
68         return false;
69     }
70 }


其它的主要是一些工具類,例如Arrays繼承了org.apache.commons.lang3.ArrayUtils,使得Arrays具有了豐富的操作集合的工具。再如Dates,Dates裡封裝了大量的對日期操作的方法,比如格式化日期、獲取某個日期當天的開始時間和結束時間等。

  
(2) lyyzoo-starter-base

  

lyyzoo-starter-base 目錄結構:


  640?wx_fmt=png

  

lyyzoo-starter-base是web應用程式的一個基礎,主要封裝了基礎實體類以及spring-base和日誌的配置。實體的頂層是AbstractEntity<ID extends Serializable>,AbstractEntity繼承BaseBean。AbstractEntity重寫了equals和hashCode方法,主要做的處理是,如果兩個實體的id相同也算這兩個物件為同一個物件。程式碼如下:


1 package com.lyyzoo.data.entity;
2 
3 import com.lyyzoo.bean.BaseBean;
4 
5 import java.io.Serializable;
6 
7 /**
8  * 抽象實體類 重寫equals和hashCode方法
9  *
10  * @author bojiangzhou
11  * @date 2017-03-28
12  */

13 @SuppressWarnings("serial")
14 public abstract class AbstractEntity<ID extends Serializableextends BaseBean implements Serializable {
15 
16     public abstract ID getId();
17 
18     @Override
19     public boolean equals(Object obj) {
20 
21         if (null == obj) {
22             return false;
23         }
24         if (this == obj) {
25             return true;
26         }
27         if (!getClass().equals(obj.getClass())) {
28             return false;
29         }
30 
31         AbstractEntity<?> that = (AbstractEntity<?>) obj;
32 
33         return null == this.getId() ? false : this.getId().equals(that.getId());
34     }
35 
36     @Override
37     public int hashCode() {
38         int hashCode = 17;
39 
40         hashCode += null == getId() ? 0 : getId().hashCode() * 31;
41 
42         return hashCode;
43     }
44 
45 }


BaseEntity則繼承AbstractEntity,BaseEntity作為其它實體的父類存在,BaseEntity定義了主鍵ID的生成策略。程式碼如下:


1 package com.lyyzoo.data.entity;
2 
3 import lombok.Data;
4 
5 import javax.persistence.GeneratedValue;
6 import javax.persistence.GenerationType;
7 import javax.persistence.Id;
8 import javax.persistence.MappedSuperclass;
9 
10 /**
11  * 統一定義id的entity基類.
12  * <p/>
13  * 抽象實體基類,提供統一的ID,和相關的基本功能
14  * <p/>
15  */

16 @Data
17 @MappedSuperclass
18 @SuppressWarnings("serial")
19 public abstract class BaseEntity extends AbstractEntity<Long{
20 
21     /**
22      * id 欄位
23      */

24     @Id
25     protected Long id;
26 
27     @Id
28     @GeneratedValue(strategy = GenerationType.IDENTITY)
29     public Long getId() {
30         return this.id;
31     }
32 
33     public void setId(Long id) {
34         this.id = id;
35     }
36 }


spring-base.xml是基礎配置,主要配置了掃描系統的配置檔案、註解等。


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3        xmlns="http://www.springframework.org/schema/beans"
4        xmlns:beans="http://www.springframework.org/schema/beans"
5        xmlns:context="http://www.springframework.org/schema/context"
6        xmlns:aop="http://www.springframework.org/schema/aop"
7        xmlns:tx="http://www.springframework.org/schema/tx"
8        xmlns:util="http://www.springframework.org/schema/util"
9        xmlns:mvc="http://www.springframework.org/schema/mvc"
10        xmlns:jee="http://www.springframework.org/schema/jee"
11        xmlns:jdbc="http://www.springframework.org/schema/jdbc"
12        xmlns:tool="http://www.springframework.org/schema/tool"
13        xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
14        xsi:schemaLocation="
15     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
16     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
17     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
18     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
19     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
20     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
21     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
22     http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
23     http://www.springframework.org/schema/tool http://www.springframework.org/schema/tool/spring-tool.xsd
24     http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd"

25 >

26 
27     <description>Spring Base Config</description>
28 
29     <!-- 載入config.properties -->
30     <context:property-placeholder location="classpath*:/config/*.properties" file-encoding="UTF-8" />
31 
32     <!-- 使用annotation 自動註冊bean, 並保證@Required、@Autowired的屬性被注入 -->
33     <context:component-scan base-package="com.lyyzoo">
34         <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
35         <context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
36     </context:component-scan>
37 
38     <!-- 支援上傳檔案 -->
39     <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
40 
41 </beans>


(3) lyyzoo-starter-jpa

  

lyyzoo-starter-jpa 目錄結構:

  640?wx_fmt=png

  

lyyzoo-starter-jpa整合了持久化相關的操作,配置等。

  

首先需要做持久化相關的配置(spring-base-jpa.xml),如資料來源、SessionFactory、事務管理等。資料來源使用c3p0,資料來源相關配置如資料庫驅動、地址等寫到到配置檔案中。配置Hibernate SessionFactory的同時,增加了JdbcTemplate。事務管理器使用Hibernate的事務管理。總的配置如下:


<?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xmlns="http://www.springframework.org/schema/beans"
 4     xmlns:beans="http://www.springframework.org/schema/beans"
 5     xmlns:tx="http://www.springframework.org/schema/tx"
 6     xmlns:aop="http://www.springframework.org/schema/aop"
 7     xmlns:context="http://www.springframework.org/schema/context"
 8     xmlns:mvc="http://www.springframework.org/schema/mvc"
 9     xmlns:util="http://www.springframework.org/schema/util"
10     xmlns:jee="http://www.springframework.org/schema/jee"
11     xmlns:jdbc="http://www.springframework.org/schema/jdbc"
12     xmlns:tool="http://www.springframework.org/schema/tool"
13     xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
14     xsi:schemaLocation="
15     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 16     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
 17     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
 18     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
 19     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
 20     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
 21     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
 22     http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
 23     http://www.springframework.org/schema/tool http://www.springframework.org/schema/tool/spring-tool.xsd
 24     http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd"

25     >

26 
27     <description>Spring Jpa</description>
28 
29     <!-- 使用C3P0 -->
30     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
31         <property name="driverClass" value="${jdbc.driver}"/>
32         <property name="jdbcUrl" value="${jdbc.url}"/>
33         <property name="user" value="${jdbc.username}"/>
34         <property name="password" value="${jdbc.password}"/>
35 
36         <!-- default: 3 -->
37         <!-- 初始化時獲取三個連線,取值應在minPoolSize與maxPoolSize之間。-->
38         <property name="initialPoolSize" value="${c3p0.initialPoolSize:5}"/>
39 
40         <!-- default: 3 -->
41         <!-- 連線池保留最小連線數-->
42         <property name="minPoolSize" value="${c3p0.minPoolSize:5}"/>
43 
44         <!-- default: 15 -->
45         <!-- 連線池保留最大連線數。-->
46         <property name="maxPoolSize" value="${c3p0.maxPoolSize:15}"/>
47 
48         <!-- default: 0(秒) = 永不丟棄-->
49         <!-- 最大空閒時間,600 秒內未使用則連線被丟棄。-->
50         <property name="maxIdleTime" value="${c3p0.maxIdleTime:600}"/>
51     </bean>
52 
53     <!-- sessionFactory -->
54     <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
 55         <property name="dataSource" ref="dataSource" />
56         <property name="hibernateProperties" >
57             <props>
58                 <prop key="dialect">${hibernate.dialect}</prop>
59                 <prop key="show_sql">${hibernate.show.sql}</prop>
60                 <prop key="hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
61             </props>
62         </property>
63         <!-- 掃描hibernate註解實體 -->
64         <property name="packagesToScan">
65             <list>
66                 <value>com.lyyzoo.*.entity</value>
67             </list>
68         </property>
69     </bean>
70 
71     <!-- jdbcTemplate -->
72     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
73         <property name="dataSource" ref="dataSource"/>
74     </bean>
75     <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
 76         <constructor-arg ref="dataSource"/>
77     </bean>
78     <bean id="jdbcTemplateSupport" class="com.lyyzoo.data.jdbc.JdbcTemplateSupport">
79         <property name="dataSource" ref="dataSource"/>
80         <property name="namedParameterJdbcTemplate" ref="namedParameterJdbcTemplate"/>
 81     </bean>
82 
83     <!-- 事務管理器 -->
84     <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
 85         <property name="sessionFactory" ref="sessionFactory" />
86     </bean>
87 
88     <!-- 事務通知屬性 -->
89     <tx:advice id="transactionManagerAdvice" transaction-manager="transactionManager">
 90         <tx:attributes>
91             <tx:method name="get*"        read-only="true"         />
92             <tx:method name="load*"        read-only="true"        />
93             <tx:method name="find*"        read-only="true"        />
94             <tx:method name="list*"        read-only="true"        />
95             <tx:method name="page*"        read-only="true"        />
96             <tx:method name="query*"    read-only="true"        />
97             <tx:method name="*"            propagation="REQUIRED"    />
98         </tx:attributes>
99     </tx:advice>
100 
101     <!-- AOP 事務 -->
102     <aop:config proxy-target-class="true">
103         <aop:pointcut id="serviceMethod" expression="execution(* com.lyyzoo..*Service.*(..))"/>
104         <aop:advisor pointcut-ref="serviceMethod" advice-ref="transactionManagerAdvice"/>
105     </aop:config>
106 
107     <!-- 掃描註解 -->
108     <context:component-scan base-package="com.lyyzoo" />
109 
110 </beans>


然後在com.lyyzoo.data.domain包下,Page封裝了分頁相關的屬性,如當前頁資料、頁碼、每頁大小、總頁數等。com.lyyzoo.data.util包下,Sqls封裝了操作sql語句的工具,比如根據傳入的查詢語句,返回查詢總數的sql語句。在com.lyyzoo.data.jdbc包下,JdbcTemplateSupport封裝了比較複雜的查詢,比如根據傳入的引數、分頁條件等,自動查詢資料、總數並封裝到Page裡返回。com.lyyzoo.data.dao包下,SimpleDao封裝了基於Hibernate SessionFactory的簡單的增刪改查操作,如save(),get()等方法。dao包下,BaseDao繼承SimpleDao,並代理了JdbcTemplateSupport,使得BaseDao具有SimpleDao和JdbcTemplateSupport的功能,BaseDao則作為其它dao的一個父類存在。最後,在com.lyyzoo.service包下,BaseService代理了BaseDao,進行了進一步的封裝,BaseService是其它service類的父類,其它service就可以直接呼叫save、get、page等內建方法。

  
(4) lyyzoo-starter-web

  

lyyzoo-starter-web自然跟web相關,在com.lyyzoo.web包下,BaseController作為controller類的父類,主要封裝了返回結果集等資訊。還有web相關配置,如檢視解析器等內容:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3     xmlns="http://www.springframework.org/schema/beans"
4     xmlns:beans="http://www.springframework.org/schema/beans"
5     xmlns:tx="http://www.springframework.org/schema/tx"
6     xmlns:aop="http://www.springframework.org/schema/aop"
7     xmlns:context="http://www.springframework.org/schema/context"
8     xmlns:mvc="http://www.springframework.org/schema/mvc"
9     xmlns:task="http://www.springframework.org/schema/task"
10     xmlns:util="http://www.springframework.org/schema/util"
11     xmlns:jee="http://www.springframework.org/schema/jee"
12     xmlns:jdbc="http://www.springframework.org/schema/jdbc"
13     xmlns:tool="http://www.springframework.org/schema/tool"
14     xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
15     xsi:schemaLocation="
16     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
17     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
18     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
19     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
20     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
21     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
22     http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd
23     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
24     http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
25     http://www.springframework.org/schema/tool http://www.springframework.org/schema/tool/spring-tool.xsd
26     http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd"

27     >

28 
29     <description>Spring Web</description>
30     
31     <!-- 載入config.properties -->
32     <context:property-placeholder location="classpath*:/config/*.properties" file-encoding="UTF-8" />
33             
34     <!-- 掃描Controller以及ControllerAdvice -->
35     <context:component-scan base-package="com.lyyzoo" use-default-filters="false">
36         <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
37         <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
38     </context:component-scan>
39 
40     <!-- 靜態資源對映 -->
41     <mvc:resources location="/static/" mapping="/static/**"/>
42 
43     <!-- 容器預設的DefaultServletHandler處理 所有靜態內容與無RequestMapping處理的URL-->    
44     <mvc:default-servlet-handler />
45 
46     <!-- 支援@Controller註解 -->
47     <mvc:annotation-driven />
48 
49     <!-- 檢視解析器 -->
50     <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
51         <property name="prefix" value="/WEB-INF/view"/>
52         <property name="suffix" value=".jsp"/>
53     </bean>
54     
55 </beans>


(5) 類結構圖

  

類結構圖參考《底層類結構.vsd》

  640?wx_fmt=png

相關文章