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的优点:
传统Web应用是单体应用,新建一个项目,把所有的东西都放到这个项目中,最后打包成war包放到Web服务器里,这种模式下的优势:开发,测试,部署,扩展方便。劣势:牵一发动全身。
微服务,这个概念是在2014年,由Martin Fowler提出的:https://martinfowler.com/microservices/。
简言之,就是将单个应用程序划分为一组小服务,每个小服务在自己的进程中运行,小服务之间通过HTTP通信,小服务围绕业务构建,可以根据需要,自由组合到应用程序中。这样,每个小服务之间就是相互独立的,都是一个可以独立替换和独立升级的软件单元。
微服务和SOA的区别:简单讲,微服务是 SOA 的延续,都强调松耦合,只是 SOA 高度依赖服务总线(ESB),而微服务不需要。微服务是一个比SOA概念更小粒度的一个说法。
功能 |
SOA |
微服务 |
组件大小 |
大块业务逻辑 |
单独任务或小块业务逻辑 |
耦合 |
通常松耦合 |
总是松耦合 |
公司架构 |
任何类型 |
小型、专注于功能交叉团队 |
管理 |
着重中央管理 |
着重分散管理 |
目标 |
确保应用能够交互操作 |
执行新功能、快速拓展开发团队 |
表格来源:https://blog.csdn.net/zpoison/article/details/80729052
这里有一个官网的介绍:https://martinfowler.com/articles/microservices.html#MicroservicesAndSoa,如果看不懂英文,可以在页面搜索“Chinese”,跳转到一个中文链接去查看文章内容。能力有限,看了一遍后,还是迷迷糊糊……
弹幕里,有人说微服务和分布式相似。应该这么来理解:微服务是架构设计方式,分布式是系统部署方式,两者概念不同。逛知乎上看到这么一句话,感觉有道理:分布式用来分散压力,微服务用来分散能力。
需要准备的工具:
maven的settings.xml配置文件的profiles标签中添加如下内容:
jdk-1.8
true
1.8
1.8
1.8
1.8
在IDEA中设置上maven的选项,因为IDEA默认使用的内置的maven。
创建一个maven项目。
添加相关依赖,如果报错,可以试试手敲,我第一次是从pdf里粘出来的,结果一直报错,手敲之后,就正常了。猜测可能是pdf里粘出来的有特殊字符导致的。
注意,这里我用的当前的最新版本,并没有使用老师的1.5.9.RELEASE。
org.springframework.boot
spring-boot-starter-parent
2.2.6.RELEASE
org.springframework.boot
spring-boot-starter-web
创建项目的主程序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包。
org.springframework.boot
spring-boot-maven-plugin
打开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的。
org.springframework.boot
spring-boot-starter-parent
2.2.6.RELEASE
它的父项目是:
org.springframework.boot
spring‐boot‐dependencies
2.2.6.RELEASE
../../spring‐boot‐dependencies
在spring-boot-starter-parent的父项目里面,有很多的版本号说明,所以在后序添加依赖的时候,有些是不需要写版本号的。
org.springframework.boot
spring-boot-starter-web
上面的这个依赖,我们可以称作一个启动器,这个启动器帮助我们导入了web模块正常运行依赖的组件。Spring Boot将所有的应用场景都抽取出来,做成一个个启动器,我们只需要在项目中引入相应的启动器即可。可以在官方文档上查到一些starters:https://docs.spring.io/spring-boot/docs/2.2.6.RELEASE/reference/html/using-spring-boot.html#using-boot-starter。
使用了@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配置文件中的:
点击@EnableAutoConfiguration,再点击AutoConfigurationImportSelector.class,查看getAutoConfigurationEntry()方法,在else里加一个断点,以debug模式启动,留意这里的configurations对象,它里面会放入一些包名,这些包名来自“META-INF/spring.factories”,我们可以在spring-boot-autoconfigure的jar里面看到,观察这些包名,都是以“AutoConfiguration”结尾的。Spring Boot帮助我们完成了自动配置,可以说J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure的jar中。
新建工程,选择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端口号了。
新建工程,选择Spring Starter Project,具体操作和IDEA大同小异。