1.Spring Boot简介

Spring Boot官网:https://spring.io/projects/spring-boot

Spring Boot的目的是:简化Spring应用的开发,约定优于配置(convention over configuration)原则同样适用。

在J2EE的开发过程中,需要许多繁琐的配置,部署流程复杂,第三方技术集成难度大,导致开发效率低下,于是Spring Boot出现了。

Spring Boot是在Spring的基础上来完成应用的开发。如果没有学过Spring的小伙伴,建议先把Spring的内容学一下,再来学Spring Boot,理解起来或许更容易一些。

Spring系列除了Spring Boot,还有Spring Cloud,打算Spring Boot学完之后,把Spring Cloud也学习一下。其中,Spring Boot是J2EE一站式解决方案,Spring Cloud是分布式整体解决方案。

Spring Boot的优点:

  • 快速创建独立运行的Spring项目以及与主流框架集成
  • 使用嵌入式的Servlet容器,应用无需打成WAR包
  • starters自动依赖与版本控制
  • 大量的自动配置,简化开发,也可修改默认值
  • 无需配置XML,无代码生成,开箱即用
  • 准生产环境的运行时应用监控
  • 与云计算的天然集成

2.微服务

传统Web应用是单体应用,新建一个项目,把所有的东西都放到这个项目中,最后打包成war包放到Web服务器里,这种模式下的优势:开发,测试,部署,扩展方便。劣势:牵一发动全身。

微服务,这个概念是在2014年,由Martin Fowler提出的:https://martinfowler.com/microservices/

简言之,就是将单个应用程序划分为一组小服务,每个小服务在自己的进程中运行,小服务之间通过HTTP通信,小服务围绕业务构建,可以根据需要,自由组合到应用程序中。这样,每个小服务之间就是相互独立的,都是一个可以独立替换和独立升级的软件单元。

微服务和SOA的区别:简单讲,微服务是 SOA 的延续,都强调松耦合,只是 SOA 高度依赖服务总线(ESB),而微服务不需要。微服务是一个比SOA概念更小粒度的一个说法。

功能

SOA

微服务

组件大小

大块业务逻辑

单独任务或小块业务逻辑

耦合

通常松耦合

总是松耦合

公司架构

任何类型

小型、专注于功能交叉团队

管理

着重中央管理

着重分散管理

目标

确保应用能够交互操作

执行新功能、快速拓展开发团队

表格来源:javascript:void(0)

这里有一个官网的介绍:https://martinfowler.com/articles/microservices.html#MicroservicesAndSoa,如果看不懂英文,可以在页面搜索“Chinese”,跳转到一个中文链接去查看文章内容。能力有限,看了一遍后,还是迷迷糊糊……

弹幕里,有人说微服务和分布式相似。应该这么来理解:微服务是架构设计方式,分布式是系统部署方式,两者概念不同。逛知乎上看到这么一句话,感觉有道理:分布式用来分散压力,微服务用来分散能力。

3.环境准备

需要准备的工具:

  • JDK(Spring Boot推荐使用JDK 1.7及以上)
  • maven(版本推荐3.3及以上)
  • IDEA或者Eclipse或者STS
  • Spring Boot

maven的settings.xml配置文件的profiles标签中添加如下内容:

<profile>
  <id>jdk-1.8</id>
  <activation>
    <activeByDefault>true</activeByDefault>
    <jdk>1.8</jdk>
  </activation>
  <properties>
    <maven.complier.source>1.8</maven.complier.source>
    <maven.complier.target>1.8</maven.complier.target>
    <maven.complier.complierVersion>1.8</maven.complier.complierVersion>
  </properties>
</profile>

在IDEA中设置上maven的选项,因为IDEA默认使用的内置的maven。

Spring Boot笔记-Spring Boot入门(一)_maven

4.Spring Boot Hello World

创建一个maven项目。

添加相关依赖,如果报错,可以试试手敲,我第一次是从pdf里粘出来的,结果一直报错,手敲之后,就正常了。猜测可能是pdf里粘出来的有特殊字符导致的。

注意,这里我用的当前的最新版本,并没有使用老师的1.5.9.RELEASE。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.6.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

创建项目的主程序HelloWorldMainApplication.java,编写启动Spring Boot项目相关代码。

package com.atguigu;

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

// @SpringBootApplication:标注这是一个主程序类,说明是一个Spring Boot应用
@SpringBootApplication
public class HelloWorldMainApplication {
    public static void main(String[] args) {
        // 启动项目
        SpringApplication.run(HelloWorldMainApplication.class, args);
    }
}

创建HelloWorldController.java,编写相应代码。

package com.atguigu.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloWorldController {
    @ResponseBody
    @RequestMapping("/hello")
    public String hello() {
        return "Hello World";
    }
}

启动HelloWorldMainApplication.java,再通过浏览器访问localhost:8080/hello就可以看到Hello World的输出了。

在pom.xml配置文件中加入如下代码,用于将应用打包成一个可执行的jar包。

<!--将应用打包成一个可执行的jar包-->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

打开maven标签,找到项目下的Lifecycle,双击package,即可实现打包,打包地址在package的命令行中也有说明。

另外,这里提一嘴,我在执行package命令的时候,控制台报错了(Error executing Maven. 2 problems were encountered while building the effective settings),这说明maven的配置文件里有问题,仔细检查下配置文件,我的问题出在profile标签里,重新敲了一遍就正常了。

Spring Boot笔记-Spring Boot入门(一)_maven_02

此时,服务就被打包成了jar,我们可以通过java -jar 来运行这个jar包,然后通过浏览器访问localhost:8080/hello,同样可以看到Hello World的字符,另外,我们注意到,jar包内是集成了Tomcat的。

5.Hello World探究

1.pom文件

1.父项目

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.6.RELEASE</version>
</parent>
它的父项目是:
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring‐boot‐dependencies</artifactId>
    <version>2.2.6.RELEASE</version>
    <relativePath>../../spring‐boot‐dependencies</relativePath>
</parent>

在spring-boot-starter-parent的父项目里面,有很多的版本号说明,所以在后序添加依赖的时候,有些是不需要写版本号的。

2.启动器

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

上面的这个依赖,我们可以称作一个启动器,这个启动器帮助我们导入了web模块正常运行依赖的组件。Spring Boot将所有的应用场景都抽取出来,做成一个个启动器,我们只需要在项目中引入相应的启动器即可。可以在官方文档上查到一些starters:https://docs.spring.io/spring-boot/docs/2.2.6.RELEASE/reference/html/using-spring-boot.html#using-boot-starter

2.主程序类,入口类

使用了@SpringBootApplication注解标记的的类作为Spring Boot的主程序类,运行一个Spring Boot项目的时候,需要找到这个注解标记的类下的Main()方法,运行这个Main()方法来启动Spring Boot应用。

点进@SpringBootApplication注解查看,这里主要看一下@SpringBootConfiguration,@EnableAutoConfiguration这2个注解。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
    @Filter(type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class}),
    @Filter(type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class})
})

点击@SpringBootConfiguration,再点击@Configuration,可以看到Configuration类上标注了一个@Component的注解,这表示Configuration类是Spring的一个组件。

点击@EnableAutoConfiguration,再点击@AutoConfigurationPackage,再点击Registrar.class,找到registerBeanDefinitions()方法,在方法体内打一个断点,以Debug方式运行,这里用Evaluate查看一下(new AutoConfigurationPackages.PackageImport(metadata)).getPackageName()的值,可以发现,它的值是com.atguigu,这个值和@SpringBootApplication注解对应类的包名是一致的,这表明Spring Boot在进行包扫描并完成自动注入的时候,扫描的是com.atguigu这个包,倘若,在com包下,有一个@Controller标记的Java类,此时,自动注入是不会把这个类注入进去的,因为Spring Boot只扫描com.atguigu及其子包,不会扫描到父包com包。这就等同于Spring配置文件中的:<context:component-scan base-package="com.atguigu" />的意思。

点击@EnableAutoConfiguration,再点击AutoConfigurationImportSelector.class,查看getAutoConfigurationEntry()方法,在else里加一个断点,以debug模式启动,留意这里的configurations对象,它里面会放入一些包名,这些包名来自“META-INF/spring.factories”,我们可以在spring-boot-autoconfigure的jar里面看到,观察这些包名,都是以“AutoConfiguration”结尾的。Spring Boot帮助我们完成了自动配置,可以说J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure的jar中。

6.使用Spring Initializer快速创建Spring Boot项目

1.IDEA快速创建Spring Boot项目

新建工程,选择Spring Initializer,指定SDK,点击下一步。

Spring Boot笔记-Spring Boot入门(一)_spring_03

填写相应信息,点击下一步。

Spring Boot笔记-Spring Boot入门(一)_spring_04

选择依赖模块,根据需要进行选择即可,这里以Spring Web为例,勾选Spring Web,点击下一步。

Spring Boot笔记-Spring Boot入门(一)_maven_05

点击Finish,向导会联网下载需要的依赖,并创建好Spring Boot项目,在java目录下,可以看到主程序类已经帮我们写好了。我们只需要写其他的业务类即可,下面做一个测试,写一个HelloController.java的类。我们知道@ResponseBody是将请求返回的数据直接写给浏览器,当我把@ResponseBody注解加在class上,表明注解对这个类中的每一个方法都起作用。此时类上有两个注解:@Controller和@ResponseBody,我们可以使用@RestController来代理这两个注解。

package com.atguigu.springboot01helloworldquick.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

// @Controller
// @ResponseBody
@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello world quick";
    }
}

启动主程序类,测试效果,可以在浏览器看到输出,即为成功。

观察项目目录结构,可以看到有一个resources文件夹,里面有两个文件夹和一个配置文件。

static文件夹:保存静态资源:js,css,image等。

templates:保存模板页面,在使用FreeMarker、Thymeleaf时会用到。另外,因为Spring Boot使用的是内置的Tomcat,所以不支持JSP。

application.properties:Spring Boot应用的配置文件,可以修改默认配置。比如可以修改端口号,server.port=8081,重启访问就需要输入8081端口号了。

2.STS

新建工程,选择Spring Starter Project,具体操作和IDEA大同小异。