文章目录
Spring Boot
1、什么是Spring Boot
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
2、Spring Boot 的特点
Spring Boot 具有以下特点:
(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
Spring Boot 可以以jar包的形式独立运行,Spring Boot 项目只需通过命令"java-jar xx.jar" 即可运行。
(2)内嵌Tomcat或Jetty等Servlet容器;
Spring Boot 使用嵌入式的 Servlet 容器 (例如 Tomcat、Jetty 或者 Undertow 等),应用无需打成WAR包。
(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
Spring Boot 提供了一系列的 “start” 项目对象模型 (POMS) 来简化 Maven 配置。
(4)尽可能自动配置Spring容器;
Spring Boot 提供了大量的默认自动配置,来简化项目的发展,开发人员也通过配置文件修改默认配置。
(5)提供准备好的特性,如指标、健康检查和外部化配置;
Spring Boot 可以对正在运行的项目库提供监控。
(6)绝对没有代码生成,不需要XML配置
Spring Boot 不需要任何xml配置即可实现Spring 的所有配置。
3、SpringBoot项目结构
如果从一个用户访问一个网站的情况来看,对应着项目代码结构来分析,可以贯穿整个代码分层
![](https://i-blog.csdnimg.cn/blog_migrate/a1564f5e098d6ec2611a6faf431c57ee.png)
对应代码目录的流转逻辑就是:
![](https://i-blog.csdnimg.cn/blog_migrate/4c38fcb9337a9dcca5720ed168c08329.png)
4、Spring Boot 分层
1、Dao 层
Dao层主要做数据持久层的工作,负责数据库进行联络的一些任务都封装在此。Dao层的设计:首先是设计Dao层的接口,然后再Spring的配置文件中定义此接口的实现类,然后就可以再将模块中调用此接口来进行数据业务的处理,而不用关心接口的具体实现类是哪个类,显得结构非常清晰,dao层的数据元配置,以及有关数据库连接参数都在Spring配置文件中进行配置。
2、Service 层
Service层主要负责业务模块的应用设计。Service层的设计:同样是首先设计接口,再设计其实现类,接着在Spring的配置文件中配置其实现的关联。这样我们就可以在应用中调用service接口来进行处理。service层的业务实现具体要调用已定义的dao层接口,封装service层业务逻辑有利于通过的业务逻辑的独立性和重复利用性。程序显得非常简洁。
3、Controller 层
Controller 层,负责具体的业务模块流程的控制,在此层要调用service层的接口来控制业务流程,控制的配置也同样是在Spring的配置文件里进行,针对具体的业务流程,会有不同的控制器。我们具体的设计过程可以将流程进行抽象归纳,设计出可以重复利用的子单元流程模块。这样不仅使程序结构变得清晰,也大大减少了代码量。
4、view 层
view层与控制层结合比较紧密,需要二者结合起来协同开发。view层主要负责前台jsp页面的显示。
5、Entity 层
Entity层是实体层,也就是所谓的model,也称pojo层数据库在项目中的类,该文件包含实体类的属性和对应属性的setXxx()、getXxx() 方法。
6、它们之间的关系
service层是建立在Dao层之上的,建立了Dao层之后才可以建立Service层,而Service层又是在Controller层之下的,因而Service层应该既调用Dao层的接口,又要提供接口给Controller层的类来进行调用,它刚好处于一个中间层的位置。每个模型都有一个Service 接口,每个接口分别封装各自的业务处理方法。
7、总结
Controller层叫做控制层,负责请求转发,接受页面过来的参数,传给Service处理,接到返回值,再传给页面。即用于接口暴露。
Service层叫做服务层,被称为服务,粗略的理解就是对一个或多个DAO进行的再次封装,封装成一个服务。即Service层用于逻辑处理,service层专注业务逻辑,对于其中需要的数据库操作,都通过Dao去实现。
Dao层叫做数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表、某个实体的增、删、改、查,不涉及业务逻辑,只是达到按某个条件获得指定数据的要求。
View层叫做表示层,此层与控制层结合起来协同工作。View层主要负责前台jsp页面的表示。
表示层(View\Web) 调用 控制层(Controller),控制层(Controller)调用业务层(Service),业务层(Service)调用数据访问层(Dao)Dao面向表,Service面向业务。后端开发时先数据库设计出所有表,然后对每一张表设计出Dao层,然后根据具体的业务逻辑进一步封装Dao层成一个Service层,对外提供成一个服务。
配置开发环境
在使用Spring Boot进行开发之前,第一件事就是配置好开发环境。这里我们以Windows操作系统为例,如果您使用的是其它操作系统,请对照其相关设置进行操作。
工欲善其事,必先利其器IDE (集成开发环境) 的选择相当重要,目前市面上有很多优秀的IDE开发工具,例如IntelliJ IDEA、Spring Tools、Visual Studio Code 和 Eclipse 等等,那么我们该如何选择呢?
这里我们极力推荐大家使用 IntelliJ IDEA,因为相比于与其他 IDE,IntelliJ IDEA 对 Spring Boot 提供了更好的支持。
Spring Boot 版本及其环境配置要求如下表。
![](https://i-blog.csdnimg.cn/blog_migrate/5cb24a16eae514f3efb3ffb986a5c000.png)
- 在 Java 官方网站下载 JDK 8.0 及以上版本,JDK 的安装以及环境配置请参考 Java JDK下载与安装教程 和 Java JDK环境变量配置 。
- Maven 3.x 的下载安装及配置过程,请参考 Maven 安装与配置。
- 浏览器访问 IntelliJ IDEA 官方下载页面,下载并安装 IntelliJ IDEA。
创建 Spring Boot 项目
开发环境配置完成后,接下来,我们就可以通过 Intellij IDEA 创建一个 Spring Boot 项目了。
Intellij IDEA 一般可以通过两种方式创建 Spring Boot 项目:
- 使用 Maven 创建
- 使用 Spring Initializr 创建
使用 Maven 创建
1.使用 IntelliJ IDEA 创建一个名称为 SpringBootDemoTest的 Maven 项目,创建过程请参考 IDEA 新建 Maven 项目。
**2. 在该 Maven 项目的 pom.xml 中添加以下配置,导入 Spring Boot 相关的依赖。 **
<project>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--添加Springmvc依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springBoot JPA的起步依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.4.RELEASE</version>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
</project>
3、新建自己的包,新建一个名为SpringBootApplication的主启动程序
![](https://i-blog.csdnimg.cn/blog_migrate/efe7628033f1b47201f6117dedd52f19.png)
此时,几乎所有的准备工作都已经准备就绪,我们可以在没有编写任何代码的情况下,直接将在Spring Boot 项目运行起来。
启动 Spring Boot
默认情况下,Spring Boot 项目会创建一个名为[***Application]的主程序启动类,该类中使用了一个组合注解@SpringBootApplication,用来开启Spring Boot 的自动配置,另外该启动类中包含一个main()方法,用来启动该项目。
SpringBoot的主程序启动类代码如下:
package com.liangzai;
import org.springframework.boot.SpringApplication;
/**
* @author liangzai
* @SpringBootApplication 是Spring Boot 项目的核心注解,目的是开启自动配置
*/
@org.springframework.boot.autoconfigure.SpringBootApplication
public class SpringBootApplication {
public static void main(String[] args) {
//启动Spring应用
SpringApplication.run(SpringBootApplication.class, args);
}
}
直接运行启动类SpringBootApplication中的main()方法,便可以启动该项目,运行结果如下。
![](https://i-blog.csdnimg.cn/blog_migrate/682b748b8d03cc599792e537bd93cb6d.png)
Spring Boot 项目SpringBootApplication 运行日志
注意:SpringBoot内部集成了 Tomcat,不需要人为手动配置TomCat,开发者只需要关注具体的业务逻辑即可。
加载数据库配置文件
虽然我们的SpringBoot的日志是启动了,但是这里会出现一个错误,需要我们手动在resource资源目录中加载一个名为application.properties的数据库配置文件。
![](https://i-blog.csdnimg.cn/blog_migrate/d410ecc3560dfb3f30fc49f6b1f40889.png)
![](https://i-blog.csdnimg.cn/blog_migrate/917ff395092e94d4fffd1f3eeb75e92b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ce89c2748da57bbde0f3df82db9db54d.png)
application.properties
# 对MySQL连接进行配置
spring.datasource.url=jdbc:mysql://master:3306/springbootdemo?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2b8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
当我们将MySQL数据库配置文件加载完毕之后我们再来运行一下
![](https://i-blog.csdnimg.cn/blog_migrate/bcb8fefac9f67904c2b9640901d0c86f.png)
端口占用解决办法
Verify the connector’s configuration, identify and stop any process that’s listening on port 8080, or configure this application to listen on another port.
翻译:验证连接器的配置,识别并停止正在侦听端口20000的任何进程,或将该应用程序配置为侦听另一个端口。
原因
由于之前使用改端口号的程序不正常关闭,导致端口并未释放,需要手动释放
解决方法
方法一:
直接重启,一般可以解决该问题,如果重启比较麻烦,可以使用下面的方法
方法二:
1、进入cmd,执行命令:[netstat -ano]
![](https://i-blog.csdnimg.cn/blog_migrate/7e711979f9d36ac7ad7d3093d1155a1c.png)
2、在窗口中继续输入:[netstat -aon|findstr “端口”],这里的提示的端口为8080,那么就输入命令为【netstat -aon|findstr “8080”】,回车之后就可以看见列表中的PID。根据PID在电脑的任务管理器中查看对应的占用程序,然后将其关闭即可。
![](https://i-blog.csdnimg.cn/blog_migrate/ad957be0ea2ff715b98dcebe9257c9ac.png)
3、我们可以看到占用8080这个程序进程的ID:26304,继续输入命令【tasklist|findstr “26304”】,26304就是进程ID,现在知道是哪个进程占用的我们就可以采取相应措施进行解决了。
![](https://i-blog.csdnimg.cn/blog_migrate/94aa51715fab2a1b5324e5ecf2969066.png)
然后我们在浏览器地址栏访问"localhost:8080"
![](https://i-blog.csdnimg.cn/blog_migrate/6cc98e9d60a95267a15fd3c47662aaa4.png)
显示出这个页面就证明我们Tomcat访问localhost:8080是通的
新建Entity、Dao、Service、Controller层
![](https://i-blog.csdnimg.cn/blog_migrate/306a013250af550479736a1bf97034e9.png)
在Entity实体层中新建Student类
这里我们再加入一个maven依赖lombok
![](https://i-blog.csdnimg.cn/blog_migrate/e8445a7612ec6c70e1b9300cce13ee72.png)
![](https://i-blog.csdnimg.cn/blog_migrate/eec7d305b6dd195b6b996cb5b0278aff.png)
点击File—Setting设置界面,开启AnnocationProcessors:
开启该项是为了让Lombok注解在编译阶段起到作用
- @Getter/@Setter: 作用类上,生成所有成员变量的getter/setter方法;作用于成员变量上,生成该成员变量的getter/setter方法。可以设定访问权限及是否懒加载等。
- @NoArgsConstructor:生成无参构造器
- @AllArgsConstructor:生成全参构造器
![](https://i-blog.csdnimg.cn/blog_migrate/8d138f9556d1e7e2c2e05a80f59bf414.png)
package com.liangzai.Entity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
/**
* @author liangzai
* @version 1.0
* Entity实体层,也就是所谓的model,也称pojo层数据库在项目中的类,
* 该文件包含实体类的属性和对应属性的setXxx()、getXxx()方法
* @Getter/@Setter: 作用类上,生成所有成员变量的getter/setter方法;
* 作用于成员变量上,生成该成员变量的getter/setter方法。
* 可以设定访问权限及是否懒加载等。
* @Getter 注解 定义getXxx()方法
* @Setter 注解 定义setXxx()方法
* @NoArgsConstructor 注解 定义无参的构造方法
* @AllArgsConstructor 注解 定义有参的构造方法
* @Entity 注解 表明是一个实体类
* @Table 注解 对应的数据表名
* @Id 注解 主键
* @GeneratedValue 注解 主键生成策略 这里用到的是描述id自增
* @Column 注解 映射表对应的字段名
*/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "student")
public class Student {
@Id
//描述id自增
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private Integer age;
private String gender;
private String clazz;
//属性名一般同数据库中表的列名保持一致,不一致时可以使用@Column注解
@Column(name = "sum_score")
private Integer sum_score;
}
至此我们Entity实体层就编写完毕了
在Dao数据持久层新建StudentRepository接口
使用Dao数据持久层进行封装
package com.liangzai.Dao;
import com.liangzai.Entity.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* @author liangzai
* @version 1.0
* Dao层主要做数据持久层的工作,负责数据库进行联络的一些任务都封装在此。
* Dao层的设计:首先是设计Dao层的接口,然后再Spring的配置文件中定义此接口的实现类,
* 然后就可以再将模块中调用此接口来进行数据业务的处理,而不用关心接口的具体实现类是哪个类,
* 显得结构非常清晰,dao层的数据元配置,以及有关数据库连接参数都在Spring配置文件中进行配置。
* @Repository 注解 修饰哪个类,则表名这个类具有对对象进行CRUD(增删改查)的功能。
*/
@Repository
//继承JpaRepository,指定一个泛型Student,和主键的类型Integer
public interface StudentRepository extends JpaRepository<Student, Integer> {
}
在Service业务服务层上新建StudentService类
该类可以根据需求实现对student信息进行CRUD(增删改查)等功能
package com.liangzai.Service;
import com.liangzai.Dao.StudentRepository;
import com.liangzai.Entity.Student;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @author liangzai
* @version 1.0
* @return 返回所有MySQL中所有的student信息
* 该类可以根据需求实现CRUD(增删改查)等功能
* Service层主要负责业务模块的应用设计。
* Service层的设计:同样是首先设计接口,再设计其实现类,
* 接着在Spring的配置文件中配置其实现的关联。这
* 样我们就可以在应用中调用service接口来进行处理。
* service层的业务实现具体要调用已定义的dao层接口,
* 封装service层业务逻辑有利于通过的业务逻辑的独立性和重复利用性。
* 程序显得非常简洁。
* @Service 注解 用于类上,标记当前类是一个service类,
* 加上该注解会将当前类自动注入到spring容器中,
* 不需要再在applicationContext.xml文件定义bean了
* @Resource 注解 默认安照名称进行装配,名称可以通过name属性进行指定,
* 如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,
* 如果注解写在setter方法上默认取属性名进行装配。
* 当找不到与名称匹配的bean时才按照类型进行装配。
* 但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配.
*/
@Service
public class StudentService {
@Resource
//引用Dao接口
private StudentRepository studentRepository;//把所有的student信息取出来
//最终返回MySQL的数据,用集合去接收student类的所有信息
public List<Student> findASll() {
//返回所有MySQL中所有的student信息
return studentRepository.findAll();
}
}
在Controller层新建StudentController类
此时我们需要先在common包里面新建一个Result类
新建common包,并新建一个Result类
该类用来创建返回对象实体(泛型)、返回结果数据格式封装
说明:code为状态码、msg为提示信息、data为返回的数据
package com.liangzai.common;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
* @param <T> 定义泛型传data数据,获取不同的响应状态及返回值
* @author liangzai
* @version 1.0
* 该类用来创建返回对象实体(泛型)、返回结果数据格式封装
* 说明:code为状态码、msg为提示信息、data为返回的数据
* @Getter 注解 定义getXxx()方法
* @Setter 注解 定义setXxx()方法
* @NoArgsConstructor 注解 定义无参的构造方法
*/
@Getter
@Setter
@NoArgsConstructor
public class Result<T> {
private String code;
private String msg;
private T data;
//定义泛型方法,传data
public Result(T data) {
this.data = data;
}
//请求成功 不反回数据(静态方法)
public static <T> Result<T> success() {
Result rs = new Result<>();
rs.setCode("200");
rs.setMsg("ok");
return rs;
}
//请求成功 返回数据(静态方法)
public static <T> Result success(T data) {
Result<T> rs = new Result<T>(data);
rs.setCode("200");
rs.setMsg("ok");
return rs;
}
//请求失败(静态方法)
public static <T> Result<T> error(String code, String msg) {
Result rs = new Result<>();
rs.setCode(code);
rs.setMsg(msg);
return rs;
}
}
200的状码如图所示
![](https://i-blog.csdnimg.cn/blog_migrate/434d3ee33a9f68433ae0ea6e2003c68f.png)
404状态码如图所示
![](https://i-blog.csdnimg.cn/blog_migrate/4ab23e75fbee3b983e50f1bfb2fa7127.png)
StudentController
package com.liangzai.Controller;
import com.liangzai.Entity.Student;
import com.liangzai.Service.StudentService;
import com.liangzai.common.Result;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* @author liangzai
* @version 1.0
* Controller层,负责具体的业务模块流程的控制,在此层要调用service层的接口来控制业务流程,
* 控制的配置也同样是在Spring的配置文件里进行,针对具体的业务流程,会有不同的控制器。
* 我们具体的设计过程可以将流程进行抽象归纳,设计出可以重复利用的子单元流程模块。
* 这样不仅使程序结构变得清晰,也大大减少了代码量。
* @RestController 注解 将数据以JSON格式返回
* @RequestMapping 注解 在SpringMVC中使用@RequestMapping来映射请求
* @Resource 注解 默认安照名称进行装配,名称可以通过name属性进行指定,
* 如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,
* 如果注解写在setter方法上默认取属性名进行装配。
* 当找不到与名称匹配的bean时才按照类型进行装配。
* 但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配.
* @GetMapping 组合注解 将HTTP Get请求映射到特定的处理方法上。
*/
@RestController //将数据以JSON格式返回
@RequestMapping("/stu")
public class StudentController {
@Resource
private StudentService studentService;
@GetMapping
public Result<List<Student>> findAll() {
List<Student> list = studentService.findAll();
return Result.success(list);
}
}
这时我们再输入[http://localhost:8080/stu] 运行一下
![](https://i-blog.csdnimg.cn/blog_migrate/c078aeb2660a96abbfa9ecac85f705a0.png)
这时我们发现返回200 ok 请求成功了
{
"code": "200",
"msg": "ok",
"data": []
}
在resource目录下新建static目录,用来实现前后端分离的view层
这里我们使用第三方工具Element来从网上找一个可以提供我们前端可视化的模板
![](https://i-blog.csdnimg.cn/blog_migrate/adb3e02258cf1f0a74aeefa1115cae00.png)
我们找到对应需要的模板,复制下来修改参数即可
static目录结构如下
![](https://i-blog.csdnimg.cn/blog_migrate/9be8b389bf91aa68c2062a85bed58960.png)
由于前端代码量太大,这里就不作展示
可视化效果如下
![](https://i-blog.csdnimg.cn/blog_migrate/29173a927d9aa3949da498c88420e8f2.png)
这里可视化只是实现了查询效果,今后可以实现删除、添加、等功能(很简单,加对应的注解即可实现)
到底啦!给靓仔一个关注吧(●’◡’●)