Springboot架构设计(一)

来源:互联网 发布:淘宝店改区域 编辑:程序博客网 时间:2024/06/07 19:46

本来一直做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:数据访问层,直接面对数据库,进行增删改查。



原创粉丝点击