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。
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标签里,重新敲了一遍就正常了。
此时,服务就被打包成了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 Web为例,勾选Spring Web,点击下一步。
点击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大同小异。