Spring Boot的前世今生以及它和Spring Cloud的关系详解。

本文详细解读了SpringBoot在Java面试中的重要性,介绍了其约定优于配置的理念,以及在Web应用构建中的简化配置。同时涵盖了SpringBoot与SpringMVC的区别,SpringBoot整合Mybatis的步骤,并讨论了SpringBoot在微服务架构中的角色和SpringBootCLI的使用。
摘要由CSDN通过智能技术生成

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 引入jar包

  • 修改web.xml,添加监听和拦截

  • 创建spring mvc核心配置文件dispatcher-servlet.xml

  • 创建controller

  • 部署到tomcat

这个过程如果不熟悉,很可能需要1~2个小时,如果是新手,可能需要更长时间。但是spring boot,不管是新手还是老手,都能够分分钟解决问题。

理解约定优于配置

========

我们知道,Spring Boot是约定由于配置理念下的产物,那么什么是约定由于配置呢?

约定优于配置是一种软件设计的范式,主要是为了减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。

简单来说,就是你所使用的工具默认会提供一种约定,如果这个约定和你的期待相符合,就可以省略那些基础的配置,否则,你就需要通过相关配置来达到你所期待的方式。

约定优于配置有很多地方体现,举个例子,比如交通信号灯,红灯停、绿灯行,这个是一个交通规范。你可以在红灯的时候不停,因为此时没有一个障碍物阻碍你。但是如果大家都按照这个约定来执行,那么不管是交通的顺畅度还是安全性都比较好。

而相对于技术层面来说,约定有很多地方体现,比如一个公司,会有专门的文档格式、代码提交规范、接口命名规范、数据库规范等等。这些规定的意义都是让整个项目的可读性和可维护性更强。

Spring Boot Web应用中约定优于配置的体现


那么在前面的案例中,我们可以思考一下,Spring Boot为什么能够把原本繁琐又麻烦的工作省略掉呢? 实际上这些工作并不是真正意义上省略了,只是Spring Boot帮我们默认实现了。

而这个时候我们反过来思考一下,Spring Boot Web应用中,相对Spring MVC框架的构建而言,它的约定由于配置体现在哪些方面呢?

  • Spring Boot的项目结构约定,Spring Boot默认采用Maven的目录结构,其中

src.main.java 存放源代码文件

src.main.resource 存放资源文件

src.test.java 测试代码

src.test.resource 测试资源文件

target 编译后的class文件和jar文件

  • 内置了嵌入式的Web容器,在Spring 2.2.6版本的官方文档中3.9章节中,有说明Spring Boot支持四种嵌入式的Web容器

Tomcat

Jetty

Undertow

Reactor

  • Spring Boot默认提供了两种配置文件,一种是application.properties、另一种是application.yml。Spring Boot默认会从该配置文件中去解析配置进行加载。

  • Spring Boot通过starter依赖,来减少第三方jar的依赖。

这些就是Spring Boot能够方便快捷的构建一个Web应用的秘密。当然Spring Boot的约定优于配置还不仅体现在这些地方,在后续的分析中还会看到Spring Boot中约定优于配置的体现。

Spring Boot整合Mybatis

====================

实际上Spring Boot的本质就是Spring,如果一定要从技术发展的过程中找到一些相似的对比的话,你们可以对比一下Jsp/Servlet和Spring MVC, 两者都可以用来开发Web项目,但是在使用上,Spring MVC的使用会更加简单。

而Spring Boot和Spring 就相当于当年的JSP/Servlet和Spring MVC的关系。所以它本身并没有所谓新的技术,接下来,我带着大家来通过Spring Boot整合Mybatis实现数据的基本操作的案例,来继续认识一下Spring Boot。

创建Spring Boot 应用


创建一个Web项目

引入项目中需要的starter依赖


mysql

mysql-connector-java

org.mybatis.spring.boot

mybatis-spring-boot-starter

2.1.2

org.springframework.boot

spring-boot-starter-thymeleaf

复制代码

创建数据库表


DROP TABLE IF EXISTS t_user;

CREATE TABLE t_user (

id int(10) unsigned NOT NULL AUTO_INCREMENT,

name varchar(20) DEFAULT NULL,

address varchar(80) DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

复制代码

配置数据库连接


spring:

datasource:

url: jdbc:mysql://192.168.13.106:3306/test_springboot

username: root

password: root

driver-class-name: com.mysql.cj.jdbc.Driver

复制代码

开发数据库访问层


1587536145803

创建实体对象

public class User {

private int id;

private String name;

private String address;

}

复制代码

创建Mapper

//@Repository可以支持在你的持久层作为一个标记,可以去自动处理数据库操作产生的异常

@Repository

@Mapper

public interface UserMapper {

User findById(int id);

List list();

int insert(User user);

int delete(int id);

int update(User user);

}

复制代码

编写mapper文件

在resource文件目录下创建UserMapper.xml文件,内容如下

<?xml version="1.0" encoding="utf-8" ?>

select * from t_user where id=#{id}

select * from t_user

insert into t_user(name,address) values(#{name,jdbcType=VARCHAR},#{address,jdbcType=VARCHAR})

delete from t_user where id=#{id}

update t_user set name=#{name,jdbcType=VARCHAR},address=#{address,jdbcType=VARCHAR} where id=#{id,jdbcType=INTEGER}

复制代码

定义service及实现

public interface IUserService {

User findById(int id);

List list();

int insert(User user);

int delete(int id);

int update(User user);

}

@Service

public class UserServiceImpl implements IUserService {

@Autowired

private UserMapper userMapper;

}

复制代码

创建Controller


@RestController

public class Controller {

@Autowired

private IUserService userService;

@GetMapping(“/user/{id}”)

public User user(@PathVariable(“id”) int id){

return userService.findById(id);

}

@GetMapping(“/users”)

public List users(){

return userService.list();

}

@PostMapping(“/user”)

public String insertUser(User user){

int row=userService.insert(user);

return row>0?“SUCCESS”:“FAILED”;

}

@PutMapping(“/user”)

public String updateUser(User user){

int row=userService.update(user);

return row>0?“SUCCESS”:“FAILED”;

}

@DeleteMapping(“/user/{id}”)

public String deleteUser(@PathVariable(“id”) int id){

return userService.delete(id)>0?“SUCCESS”:“FAILED”;

}

}

复制代码

修改配置


  • 在Spring 的Main方法上增加以下注解,用来扫描Mybatis的Mapper文件

@MapperScan(“com.example.demo.mapper”)

复制代码

  • 配置Mapper配置文件的地址,在application.yml中

mybatis:

mapper-locations: classpath:*Mapper.xml

复制代码

id int,

name varchar(20),

address varchar(20)

)

项目打包


  • mvn -Dmaven.test.skip -U clean install

  • java -jar xxx.jar

简单总结


这个代码,我想,大家应该写过无数遍了,而在基于Spring Boot集成Mybatis这个案例中,核心的业务逻辑并没有减少,它只减少了一些繁琐的配置,使得我们更聚焦在业务开发层面。

简单来说,基于Spring Boot的项目中,我们只需要写Controlelr、Service、Dao即可。甚至很多情况下我们dao都不需要管,比如使用mybatis-plus这个插件,就可以省去很多固定的dao层逻辑。

所以实际上,Spring Boot并没有新鲜的东西,因此你看到市面上大部分讲spring boot的书,这些书我几乎都看过,基本上都是讲解Spring Boot的应用,以及Spring Boot的一些特性分析。因为一旦你想讲Spring Boot的原理,就必然会回归到Spring这块的内容上。比如小马哥的Spring Boot编程思想着本书,大篇幅的都是在讲Spring Framework。因为Spring Boot的内核还是Spring Framework。

Spring Boot与微服务

===============

接下来,给大家讲讲spring boot与微服务这块的内容。

什么是Spring Cloud


首先,我们要简单了解一下什么是微服务,按照我的理解来说,微服务就是微粒度的服务,它是面向服务架构(SOA)的进一步优化。如果大家不是很好理解,翻译成白话就是

一个业务系统,原本是在一个独立的war包中。现在为了更好的维护和提高性能,把这个war包按照业务纬度拆分成了一个个独立的业务子系统,每个子系统提供该业务领域相关的功能,并暴露API接口。

这些服务彼此之间进行数据交换和通信来实现整个产品的功能。

而这些业务子系统,实际上代表的就是一个服务,那么所谓的微服务,说的是这个服务的粒度。至于服务的粒度什么样才叫微,其实没有一个固定的衡量标准。更多的还是在每个公司具体的业务粒度的把控上。

微服务化遇到的问题


在为服务化之后,会面临很多的问题,比如服务注册、服务路由、负载均衡、服务监控等等。这些问题都需要有相应的技术来解决,这个时候,Spring Cloud就出现了。

简单来说,Spring Cloud 提供了一些可以让开发者快速构建微服务应用的工具,比如配置管理、服务发现、熔断、智能路由等,这些服务可以在任何分布式环境下很好地工作。Spring Cloud 主要 致力于解决如下问题:

  • Distributed/versioned configuration,分布式及版本化配置。

  • Service registration and discovery,服务注册与发现。

  • Routing,服务路由。

  • Service-to-service calls,服务调用。

  • Load balancing,负载均衡。

  • Circuit Breakers,断路器。

  • Global locks,全局锁。

  • Leadership election and cluster state,Leader 选举及集群状态。

  • Distributed messaging,分布式消息。

需要注意的是,Spring Cloud 并不是 Spring 团队全新研发的框架,它只是把一些比较优秀的解决微服务架构中常见问题的开源框架基于 Spring Cloud 规范进行了整合,通过 Spring Boot 这个 框架进行再次封装后屏蔽掉了复杂的配置,给开发者提供良好的开箱即用的微服务开发体验。不难看出,Spring Cloud 其实就是一套规范,而 Spring Cloud Netflix、Spring Cloud Consul、Spring CloudAlibaba 才是 Spring Cloud 规范的实现。

为什么Spring Cloud是基于Spring Boot


那为什么Spring Cloud会采用Spring Boot来作为基础框架呢?原因很简单

  1. Spring Cloud它是关注服务治理领域的解决方案,而服务治理是依托于服务架构之上,所以它仍然需要一个承载框架

  2. Spring Boot 可以简单认为它是一套快速配置Spring应用的脚手架,它可以快速开发单个微服务

在微服务架构下,微服务节点越来越多,需要一套成熟高效的脚手架,而Spring Boot正好可以满足这样的需求,如下图所示。

image-20211124135348046

Spring Boot的四大核心机制

==================

如果一定要基于Spring Boot的特性去说,那么只能去说Spring Boot的四大核心机制,分别是@EnableAutoConfiguration 、 Starter开箱即用组件、Actuator应用监控、Spring Boot CLI 命令行工具。

EnableAutoConfiguration


Starter


告诉Spring Boot需要什么功能,它就能引入需要的库。

Actuator


让你能够深入运行中的Spring Boot应用程序

Spring Boot CLI


Spring Boot CLI 为Spring Cloud 提供了Spring Boot 命令行功能。我们可以通过编写groovy脚本来运行Spring Cloud 组件应用程序。步骤如下、

  • 下载spring-boot-cli

Spring Boot CLI:repo.spring.io/release/org…

  • 配置环境变量

  • 在控制台spring --version查看CLI版本

  • 使用CLI运行应用。我们可以使用run命令编译和运行Groovy源代码。Spring Boot CLI中包含所有运行Groovy所需要的依赖。

  • 创建一个hello.groovy文件

@RestController

class HelloController {

@GetMapping(“/hello”)

String hello(){

return “Hello World”;

}

}

复制代码

  • 在控制台执行spring run hello.groovy,如果需要传递参数,比如端口,和JVM参数类似

spring run hello.groovy – --server.port=9000

复制代码

Spring Boot的四大核心特性

==================

  • EnableAutoConfiguration

  • Starter

  • Actuator

  • Spring Boot CLI

Spring Boot CLI 为Spring Cloud 提供了Spring Boot 命令行功能。我们可以通过编写groovy脚本来运行Spring Cloud 组件应用程序。步骤如下、

  • 下载spring-boot-cli

Spring Boot CLI:repo.spring.io/release/org…

  • 配置环境变量

  • 在控制台spring --version查看CLI版本

  • 使用CLI运行应用。我们可以使用run命令编译和运行Groovy源代码。Spring Boot CLI中包含所有运行Groovy所需要的依赖。

  • 创建一个hello.groovy文件

@RestController

class HelloController {

@GetMapping(“/hello”)

String hello(){

return “Hello World”;

}

总结

就写到这了,也算是给这段时间的面试做一个总结,查漏补缺,祝自己好运吧,也希望正在求职或者打算跳槽的 程序员看到这个文章能有一点点帮助或收获,我就心满意足了。多思考,多问为什么。希望小伙伴们早点收到满意的offer! 越努力越幸运!

金九银十已经过了,就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。但很多小伙伴却苦于没有合适的资料来回顾整个 Java 知识体系,或者有的小伙伴可能都不知道该从哪里开始复习。我偶然得到一份整理的资料,不论是从整个 Java 知识体系,还是从面试的角度来看,都是一份含技术量很高的资料。

三面蚂蚁核心金融部,Java开发岗(缓存+一致性哈希+分布式)

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
t-cli

Spring Boot CLI:repo.spring.io/release/org…

  • 配置环境变量

  • 在控制台spring --version查看CLI版本

  • 使用CLI运行应用。我们可以使用run命令编译和运行Groovy源代码。Spring Boot CLI中包含所有运行Groovy所需要的依赖。

  • 创建一个hello.groovy文件

@RestController

class HelloController {

@GetMapping(“/hello”)

String hello(){

return “Hello World”;

}

总结

就写到这了,也算是给这段时间的面试做一个总结,查漏补缺,祝自己好运吧,也希望正在求职或者打算跳槽的 程序员看到这个文章能有一点点帮助或收获,我就心满意足了。多思考,多问为什么。希望小伙伴们早点收到满意的offer! 越努力越幸运!

金九银十已经过了,就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。但很多小伙伴却苦于没有合适的资料来回顾整个 Java 知识体系,或者有的小伙伴可能都不知道该从哪里开始复习。我偶然得到一份整理的资料,不论是从整个 Java 知识体系,还是从面试的角度来看,都是一份含技术量很高的资料。

[外链图片转存中…(img-ukkgSjrz-1714748676546)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值