本來一直做Android設計,因爲工作需要目前負責Java後端。主要使用的框架是SpringBoot。自己習慣在做項目的時候進行架構設計,實現低耦合,高靈活,快速開發。研究的時間不長,目前做了一個簡單的Java SpringBoot項目架構,簡單梳理一下。
一、建立項目的時候把Mysql選上,創建項目之後需要添加數據庫連接信息。數據庫是提前創建好的。連接信息可以寫在application.properties文件中,也可以建立一個配置類進行設置;
二、配置服務器容器。項目默認使用的是Intellij Idea自帶的虛擬容器,我們調試使用的是外部安裝的Tomcat,所以要配置Artifacts,把項目發佈到外部Tomcat的站點當中,一定要把後加的包都添加進去;
三、Application.java是啓動文件,嚮導已經創建好了,要在外部成功訪問,我們需要完善一下:
@SpringBootApplication
@EnableJpaRepositories(basePackages = "com.meiyue", repositoryFactoryBeanClass = BaseRepositoryFactoryBean.class)
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication springApplication=new SpringApplication(Application.class);
springApplication.run(args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
}
除了main方法,其他方法都是可以放在另外的類中去管理的。
四、講一下分包,這是我的基本分包
bean:存放實體類,期中又分爲base、entity、parameter、protocol四個。
bean/base:存放一些固定規範的類,比如我們自定義的分頁模型;
bean/entity:存放根據數據庫表映射過來的實體類,以及數據打包需要的實體類;
bean/parameter:用body方式請求時需要添加的參數解析實體類;
bean/protocol:數據請求和返回規範性數據結構的實體類,比如固定參數,請求體結構,返回體結構等等。
以下是四種規範性的實體類:
1.分頁模型:
public class PageModel<DataType> {
public int page;//當前頁碼
public int pageSize;//頁面大小
public long count;//數據總數
public boolean hasNext;//是否還有下一頁
public List<DataType> dataList;//數據列表
public PageModel() {
}
public PageModel(int page, int pageSize) {
this.page = page;
this.pageSize = pageSize;
}
public PageModel(int page, int pageSize, long count) {
this.page = page;
this.pageSize = pageSize;
this.count = count;
}
public PageModel(int page, int pageSize, List<DataType> dataList) {
this.page = page;
this.pageSize = pageSize;
this.dataList = dataList;
}
}
2.固定參數(自定義)
public class NetProtocol {
private String ver;
private String os;
private String channel;
private String token;
private double lng;
private double lat;
public String getVer() {
return ver;
}
public void setVer(String ver) {
this.ver = ver;
}
public String getOs() {
return os;
}
public void setOs(String os) {
this.os = os;
}
public String getChannel() {
return channel;
}
public void setChannel(String channel) {
this.channel = channel;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public double getLng() {
return lng;
}
public void setLng(double lng) {
this.lng = lng;
}
public double getLat() {
return lat;
}
public void setLat(double lat) {
this.lat = lat;
}
}
3.請求體
public class NetRequest<ParaType> {
private NetProtocol protocol;//固定協議參數
private ParaType params;//自定義參數
public NetRequest() {
}
public NetProtocol getProtocol() {
return protocol;
}
public void setProtocol(NetProtocol protocol) {
this.protocol = protocol;
}
public ParaType getParams() {
return params;
}
public void setParams(ParaType params) {
this.params = params;
}
}
public class NetResult<DataType> {
private int code;//錯誤碼 0:請求成功
private String msg;//消息
private DataType data;//數據體
public NetResult() {
}
public NetResult(int code, String msg) {
this.code = code;
this.msg = msg;
}
public NetResult(int code, String msg, DataType data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public DataType getData() {
return data;
}
public void setData(DataType data) {
this.data = data;
}
}
config:存放配置類,可以根據需要把配製方法寫入一個類,也可以根據分類寫到各自的文件中。其下還分爲filter、interceptor和listener三個文件夾,分別存放自定義的過濾器、攔截器和監聽器;
constants:專門存放常量的地方,其下有一個sql文件夾,專門設計存放各個數據類型的Repository(DAO層)需要進行數據操作的SQL語句;
library:與項目無關的庫,這是架構的核心,是可以移植的。
library/custom:自定義的Repository、Service和Controller,全部都是預封裝實現解耦和快速開發的;
library/model:與項目無關的通用的實體類,比如一些常見的body參數解析類:
public class PageRequest {
private int page;
private int pageSize;
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
}
library/utils:工具類,如:
public class ResultUtils {
/**
* 構建一個字符串類型的返回結果
*
* @param obj
* @return
*/
public static String build(Object obj) {
return JsonUtils.toJson(obj);
}
/**
* 構建一個NetResult<DataType>類型的返回結果
*
* @param obj
* @param <DataType>
* @return
*/
public static <DataType> NetResult<DataType> buildResult(DataType obj) {
NetResult<DataType> result = new NetResult<>(0, "success", obj);
return result;
}
}
locallibs:與項目有關的一些封裝;
controller:項目展現層,緊密關聯前端提供的接口需求文檔,對從service層調用的各種數據進行組裝,不進行復雜數據處理;
service:業務邏輯層,負責把從repository(DAO層)層或者其他手段獲取的原始數據進行規範性加工,形成規範性數據,提供給controller組裝發貨;
dao:數據訪問層,直接面對數據庫,進行增刪改查。