主要讲解点:
1、 Spring Boot工程的创建和启动(重点)
2、 Spring Boot的自动配置(重点)
3、 Spring Boot的起步依赖(重点)
4、 Spring Boot的命令行(了解)
5、 Spring Boot的Actuator(有空再去深究)
一、Spring Boot是什么?
Spring Boot不是应用服务器。这个误解是这样产生的: Spring Boot可以把Web应用程序变为可自执行的JAR文件,不用部署到传统Java应用服务器里就能在命令行里运行。 Spring Boot在应用程序里嵌入了一个Servlet容器(Tomcat、 Jetty或Undertow) ,以此实现这一功能。但这是内嵌的Servlet容器提供的功能,不是Spring Boot实现的。
与之类似, Spring Boot也没有实现诸如JPA或JMS(Java Message Service, Java消息服务)之类的企业级Java规范。它的确支持不少企业级Java规范,但是要在Spring里自动配置支持那些特性的Bean。例如, Spring Boot没有实现JPA,不过它自动配置了某个JPA实现(比如Hibernate)的Bean,以此支持JPA。
最后, Spring Boot没有引入任何形式的代码生成,而是利用了Spring 4的条件化配置特性,以及Maven和Gradle提供的传递依赖解析,以此实现Spring应用程序上下文里的自动配置。
简而言之,从本质上来说,Spring Boot就是Spring,它做了那些没有它你自己也会去做的Spring Bean配置。谢天谢地,幸好有Spring Boot,你不用再写这些样板配置了,可以专注于应用程序的逻辑。
二、为什么要用Spring Boot?
简化Spring应用程序的开发,让开发人员把精力放在程序功能和业务上。
“虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始, Spring用XML配置,而且是很多XML配置。 Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。 Spring 3.0引入了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML。尽管如此,我们依旧没能逃脱配置的魔爪。开启某些Spring特性时,比如事务管理和SpringMVC,还是需要用XML或Java进行显式配置。启用第三方库时也需要显式配置,比如基于Thymeleaf的Web视图。配置Servlet和过滤器(比如Spring的DispatcherServlet)同样需要在web.xml或Servlet初始化代码里进行显式配置。组件扫描减少了配置量, Java配置让它看上去简洁不少,但Spring还是需要不少配置。所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换,所以写配置挤占了写应用程序逻辑的时间。和所有框架一样, Spring实用,但与此同时它要求的回报也不少。
除此之外,项目的依赖管理也是件吃力不讨好的事情。决定项目里要用哪些库就已经够让人头痛的了,你还要知道这些库的哪个版本和其他库不会有冲突,这难题实在太棘手。并且,依赖管理也是一种损耗,添加依赖不是写应用程序代码。一旦选错了依赖的版本,随之而来的不兼容问题毫无疑问会是生产力杀手。”---摘自《spring boot实战》
通过以上的介绍,我们应该明确传统spring 编程带来如下问题:
1、 大量配置文件(spring bean,tx,mvc,servlet等)
2、 依赖问题(功能所需要的依赖,依赖之间的冲突)
3、重复性配置(Spring开发的Web应用程序必需的通用样板重复出现)
三、Spring Boot主要思想
Spring Boot提供了一种新的编程范式,能在最小的阻力下开发Spring应用程序。有了它,你可以更加敏捷地开发Spring应用程序,专注于应用程序的功能,不用在Spring的配置上多花功夫,甚至完全不用配置。实际上, Spring Boot的一项重要工作就是让Spring不再成为你成功路上的绊脚石。具体体现在如下思想:
1、自动配置:针对很多Spring应用程序常见的应用功能,Spring Boot能自动提供相关配置。
2、起步依赖:告诉Spring Boot需要什么功能,它就能引入需要的库。
3、命令行界面:这是Spring Boot的可选特性,借此你只需写代码就能完成完整的应用程序,无需传统项目构建。
4、Actuator:让你能够深入运行中的Spring Boot应用程序,一探究竟。
总之,每一个特性都在通过自己的方式简化Spring应用程序的开发。
四、Spring Boot之自动配置
实际开发过程中,我们会经常配置如下dataSource和JdbcTemplate
它们只是典型Spring应用程序配置的一小部分。除此之外,还有无数Spring应用程序有着完全相同的方法。 只要是数据源配置且需要JdbcTemplate都需要用到上面的配置。如 果 在 Classpath 里 发 现JdbcTemplate,那么它还会为你配置一个JdbcTemplate的Bean。你无需操心那些Bean的配置,Spring Boot会做好准备,随时都能将其注入到你的Bean里。
Spring Boot的自动配置远不止JdbcTemplate,它有大把的办法帮你减轻配置负担,这些自动配置涉及Java持久化API(Java Persistence API, JPA)、 Thymeleaf模板、安全和Spring MVC。
五、Spring Boot之起步依赖
向项目中添加依赖是件富有挑战的事。你需要什么库?它的Group和Artifact是什么?你需要哪个版本?哪个版本不会和项目中的其他依赖发生冲突?
Spring Boot通过起步依赖为项目的依赖管理提供帮助。起步依赖其实就是特殊的Maven依赖和Gradle依赖,利用了传递依赖解析,把常用库聚合在一起,组成了几个为特定功能而定制的依赖。举个例子,假设你正在用Spring MVC构造一个REST API,并将JSON(JavaScript ObjectNotation)作为资源表述。此外,你还想运用遵循JSR-303规范的声明式校验,并使用嵌入式的Tomcat服务器来提供服务。要实现以上目标,你在Maven至少需要以下8个依赖:
qorg.springframework:spring-core
qorg.springframework:spring-web
qorg.springframework:spring-webmvc
qcom.fasterxml.jackson.core:jackson-databind
qorg.hibernate:hibernate-validator
qorg.apache.tomcat.embed:tomcat-embed-core
qorg.apache.tomcat.embed:tomcat-embed-el
qorg.apache.tomcat.embed:tomcat-embed-logging-juli
不过,如果打算利用Spring Boot的起步依赖,你只需添加Spring Boot的Web起步依赖
(org.springframework.boot:spring-boot-starter-web) 仅此一个。它会根据依赖传递把其他所需依赖引入项目里,你都不用考虑它们。比起减少依赖数量,起步依赖还引入了一些微妙的变化。向项目中添加了Web起步依赖,实际上指定了应用程序所需的一类功能。因为应用是个Web应用程序,所以加入了Web起步依赖。
与之类似,如果应用程序要用到JPA持久化,那么就可以加入jpa起步依赖。如果需要安全功能,那就加入security起步依赖。简而言之,你不再需要考虑支持某种功能要用什么库了,引入相关起步依赖就行。
此外, Spring Boot的起步依赖还把你从“需要这些库的哪些版本”这个问题里解放了出来。起步依赖引入的库的版本都是经过测试的,因此你可以完全放心,它们之间不会出现不兼容的情况。
六、Spring Boot之命令行界面
Spring Boot CLI是Spring Boot的非必要组成部分。Spring Boot CLI利用了起步依赖和自动配置,让你专注于代码本身。我们来分析一段spring boot代码:
@RestController
class HelloController {
@RequestMapping("/")
def hello() {
return "Hello World"
}
}
你是否注意以上代码中没有import? CLI如何知道RequestMapping和RestController来自哪个包呢?说到这个问题,那些类最终又是怎么跑到Classpath里的呢?
说得简单一点, CLI能检测到你使用了哪些类,它知道要向Classpath中添加哪些起步依赖才能让它运转起来。一旦那些依赖出现在Classpath中,一系列自动配置就会接踵而来,确保启用DispatcherServlet和Spring MVC,这样控制器就能响应HTTP请求了。
七、Spring Boot之Actuator
Spring Boot的最后一块“拼图”是Actuator,其他几个部分旨在简化Spring开发,而Actuator
则要提供在运行时检视应用程序内部情况的能力。安装了Actuator就能窥探应用程序的内部情况,包括如下细节:
Spring应用程序上下文里配置的Bean
Spring Boot的自动配置做的决策
应用程序取到的环境变量、系统属性、配置属性和命令行参数
应用程序里线程的当前状态
应用程序最近处理过的HTTP请求的追踪情况
各种和内存用量、垃圾回收、 Web请求以及数据源用量相关的指标
Actuator通过Web端点和shell界面向外界提供信息。如果要借助shell界面,你可以打开SSH(Secure Shell),登入运行中的应用程序,发送指令查看它的情况。
八、Spring Boot工程创建(使用spring initializr初始化项目)
通过spring initializr工具来构建一个spring boot 项目,说白了就是提供一个工程的基本结构,以及一个用于构建代码的maven或者gradle的说明文件。官方提供了如下几种方式来初始一个spring boot项目工程:
通过Web界面使用。
通过Spring Tool Suite使用。
通过IntelliJ IDEA使用。
使用Spring Boot CLI使用。
1、 通过Web界面创建,访问http://start.spring.io/
2、 通过spring-tool-suite IDE工具来初始化
1)选中File,点击New,选择Spring Starter Project
2)创建工程,选择起步依赖
不知道勾选哪些,可以参照Spring Boot实战.pdf
3)点击Finish完成
3、 通过idea工具来初始化
4、 通过spring boot cli来初始化(需要先安装cli,见下方),在命令行输入命令spring init,如图:
demo.zip就是一个spring boot的压缩包,是不是很神奇!
5、 补充:除了以上四种主要创建spring boot工程的方式,还可以自己手动创建maven工程,再添加起步依赖,创建application.properties等
第4种初始化方式需要安装cli,以下是安装spring boot cli的步骤:
1、 下载cli的安装包
下载地址:http://repo.spring.io/release/org/springframework/boot/spring-boot-cli/
下载感兴趣的版本,本教学选择的是1.3版本
2、 解压目录,将该目录bin配置到环境变量
SPRING_BOOT_CLI= D:\spring-boot-cli-1.3.0
path=…; %SPRING_BOOT_CLI%\bin;…
打开cmd,检验是否成功:
3、 spring boot cli提供的shell 及其命令补全脚本
通过Tab键可以补全其提供的命令:
九、启动Spring Boot工程
1、 方式一:找到启动类,右键Run As->Java Application运行启动
2、 方式二:选中工程右键Run As->Spring Boot App
3、方式三:选中工程右键Run As->Maven Build配置spring-boot:run
4、方式四:通过sts的Boot Dashboard启动,需要sts3.7及以上版本
找到Window -> Show View -> Boot Dashboard
选中工程,点击start就可以启动了
5、方式五:直接启动install之后的jar
java -jar xxx.jar
十、修改spring boot启动的banner
1、进入http://patorjk.com/software/taag/
2、在spring boot项目src/main/resource下面新建banner.txt
3、在banner.txt中将刚才产生的字符串粘贴到该banner.txt文件中
4、启动spring boot项目
十一、Spring Boot之Actuator使用
这是探究springboot整个运行的状态
步骤:
1、加入spring-boot-starter-actuator起步依赖
2、启动spring boot项目,然后在浏览器上访问
比如想知道所有spring上下文中的bean可以访问:http://localhost:配置的端口/beans
十二、Spring Boot相关注解总结
@ScanComponent等价于 <context:component-scan basepackage=""/>
@Configuration等价于applicationContext.xml
@Import 等价于applicationContext.xml中的<import>标签
@Bean 等价于applicationContext.xml中的<bean id/name>标签
@Scope 等价于applicationContext.xml中的<bean>标签中的scope属性
@RestController=@Controller+@ResponseBody 使用该注解,方法返回一定是数据,而不是视图
启动相关配置:
@SpringBootApplication 在类上加入,证明该类是springboot的启动类
@SpringBootApplication=@Configuration+@ComponentScan+@EnableAutoConfiguration
加载相关配置:
1.@EnableAutoConfiguration 这个注解代表自动配置
2.@EnableConfigurationProperties(ThymeleafProperties.class) 加载properties 对应的类
3.@ConditionalOnClass(SpringTemplateEngine.class) 这是代表了条件的注解,该主键中传递的参数是用来判断的
4.@AutoConfigureAfter(WebMvcAutoConfiguration.class) 在参数中声明的类加载完了之后,才会去自动配置
测试相关配置:
@RunWith(SpringRunner.class) SpringRunner 继承了SpringJunit4Runner
@SpringBootTest 这里可以换成@ContextConfiguration