logo头像

分享技术,品味人生

Java前后端分离之SpringBoot项目搭建

本文讲解SpringBoot和Vue项目搭建的最小化原型,非常方便后续同类知识点的学习,同时也是非常棒的脚手架,可快速搭建各种实验的基础框架,本文实践与2022年7月10号,练习前建议仔细核对相关软件版本,避免引起不必要的麻烦。

后端SpringBoot项目方面,全程采用纯手工代码的方式,而实际企业项目中可能采用mybatis-plus等插件,极大减少代码量和维护工作量,我们将于后续补充这块的讲解。测试方面引入postman做验证,科学严谨的质量检测是一切项目的代码质量保证,研发工作需要有个闭环,最后我们介绍如何将SpringBoot项目如何交付给测试/生产环境做部署。

因篇幅所限,Vue项目搭建、与SpringBoot项目联调联试的内容我们将在下一篇幅中讲解。

一、SpringBoot项目搭建

项目准备工作

  • 实验测试时间位2022年7月10日
  • 开发机采用 Win10 64位操作系统
  • 开发IDE采用ItelliJ IDEA 2022.1.3 官网企业版
  • JDK采用1.8.0_121
  • 构建工具采用IDEA自带捆绑的3.8.1,并设置了阿里云镜像加速
  • SpringBoot采用2.7.1版本,未附加其他插件,保障原型最小化,避免不必要的干扰

Tip: 以上工具软件均可在网上搜索得到,安装文档也容易取得,这里不过多赘述

项目代码一览

  1. pom.xml 项目构建所需的脚本文件,常用于开发和maven构建时提供所需插件的信息及构建的实际动作。
  2. DemoApplication.java 项目入口文件,由IDE的Spring Initializr生成器自动生成,未做修改。
  3. bean/Book.java mvc架构中常见的实体bean,通常与物理表结构一对一,主要包括属性、getset、构造函数。
  4. service/BookService.java mvc架构中的服务层接口,常用于Controller类的注入和调用。
  5. service/impl/BookServiceImpl.java 服务层接口的真实代码实现,后端数据抽取、加工、填充的主要部分。
  6. controller/BookController.java mvc架构中视图层的相应代码,与web的交互都在这里做处理
  7. WebMvcConfig.java 用于处理vue跨域访问的设置,非必须,同类工作也可在vue中实现

image-20220710073629856

1/7、pom.xml IDE生成器自动生成,未做修改

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.iyyxx</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>demo</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2/7、DemoApplication.java IDE生成器自动生成,未做修改

package com.iyyxx.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

3/7、Book.java

package com.iyyxx.demo.bean;

import java.io.Serializable;

public class Book implements Serializable {

    private static final long serialVersionUID = 1L;

    public Book(int id, String bookName, String author, String publish, Integer pages, Float price) {
        this.id = id;
        this.bookName = bookName;
        this.author = author;
        this.publish = publish;
        this.pages = pages;
        this.price = price;
    }

    private int id;

    private String bookName;

    private String author;

    private String publish;

    private Integer pages;

    private Float price;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getPublish() {
        return publish;
    }

    public void setPublish(String publish) {
        this.publish = publish;
    }

    public Integer getPages() {
        return pages;
    }

    public void setPages(Integer pages) {
        this.pages = pages;
    }

    public Float getPrice() {
        return price;
    }

    public void setPrice(Float price) {
        this.price = price;
    }
}

4/7、BookService.java 定义了集合查询接口,用于vue项目中的数据查询

package com.iyyxx.demo.service;

import com.iyyxx.demo.bean.Book;
import java.util.List;

public interface BookService {
    List<Book> findAll();
}

5/7、BookServiceImpl.java 服务接口的代码实现,为保障原型最小化,这里采用伪代码,后续可替换为mybatis等实现

package com.iyyxx.demo.service.impl;

import com.iyyxx.demo.bean.Book;
import com.iyyxx.demo.service.BookService;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;


@Service
public class BookServiceImpl implements BookService {
    public List<Book> findAll() {
        List<Book> list = new ArrayList<Book>();
        list.add(new Book(1, "书剑恩仇录1", "金庸", "电子工业出版社", 100, 35.6f));
        list.add(new Book(2, "书剑恩仇录2", "金庸", "电子工业出版社", 100, 35.6f));
        list.add(new Book(3, "书剑恩仇录3", "金庸", "电子工业出版社", 100, 35.6f));
        list.add(new Book(4, "书剑恩仇录4", "金庸", "电子工业出版社", 100, 35.6f));
        list.add(new Book(5, "书剑恩仇录5", "金庸", "电子工业出版社", 100, 35.6f));
        return list;
    }
}

**6/7、BookController.java ** 视图层做了两种不同的实现,方便前端调取文本和列表做展示

package com.iyyxx.demo.controller;

import com.iyyxx.demo.bean.Book;
import com.iyyxx.demo.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;


@RestController
public class BookController {

    @Autowired
    private BookService bookService;

    @GetMapping("/list")
    public List<Book> findAll(){
        return bookService.findAll();
    }

    @GetMapping("/test")
    public String test(){
        return "hello springboot";
    }
}

7/7、WebMvcConfig.java 跨域配置,非必须,也可在vue中实现

package com.iyyxx.demo;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        //跨域配置
        registry.addMapping("/**")
                .allowedOriginPatterns("*")
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                .allowCredentials(true)
                .maxAge(3600)
                .allowedHeaders("*");
    }
}

二、SpringBoot项目测试

本项目测试成功的原则标准:

  • 编译器自检无严重bug
  • web服务可正常启动
  • 查询两个数据接口均为正常返回

运行检查:执行alt+shift+x或鼠标点击IDE右上角绿色三角箭头,启动DemoApplication项目,一切正常!

image-20220710075032766

服务检查:浏览器访问/test和/list接口也正常返回

image-20220710075323782

补充: json数据的返回、检查不易观看,可在edge中安装插件,或使用postman等工具,提供效率,效果如下

image-20220710075436231

三、SpringBoot项目部署

通常j2ee的项目交付测试或生产时一般是打包成war部署到tomcat、jboss等中间件,而springboot设计理念本着精简、微服务,可将代码通过pom设置的插件打包成jar,通过对main-class的设置和自我实现,可将jar用java命令直接运行,这样非常方便未来进行容器集成和部署!

当然,如果要打包成war也是一点问题都没有的,网上可以找到很多例子。

打包部署

# 点击ide中的mvn面板或执行以下脚本,生产jar文件
mvn package
    
# 运行
java -jar demo-xxx.jar

结语

SpringBoot 项目非常轻松的完成了,不要忘了技术原理的学习,未来很多技术会高度集成和简化,技术实现原理往往几十年都不会有大改动。所以掌握好原理就能以不变应万变,学习就会有加速!

评论系统未开启,无法评论!