Springboot架構設計(一)

本來一直做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;
    }
}


4.返回體


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:數據訪問層,直接面對數據庫,進行增刪改查。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章