Spring Boot基础
SpringBoot为服务框架
Spring Boot简史
Spring1.x
在Spring1.x时代,都是通过XML文件配置Bean,随着项目的不断扩大,需要将XML配置分放到不同的配置文件当中,需要频繁的在Java类和XML配置文件中来回切换。
Spring2.x
随着JDK1.5带来的注解支持,Spring2.x可以使用注解对Bean进行申明和注入,大大的减少了XML的配置文件,同时也大大的简化了项目的开发。那么问题来了,究竟是该使用XML还是注解呢?
最佳实践
应用的基本配置使用XML:比如数据源,资源文件等
业务开发用注解,比如:Servuce中注入Bean等
Spring3.x
从Spring3.x开始提供了Java配置方式,使用Java配置方式可以更好的理解配置的Bean,现在我们就处于现在这个状态,并且Spring4.x和Spring Boot都推荐使用Java配置的方式
Spring5.x
Spring5.x是Java首个支持响应式的Web框架,是Spring的一个重要版本,距离Spring4.x差不多四年的时间,在此期间,大多数增强都是在Spring Boot项目中完成的,其中最大的亮点就是提供了完整的端到端响应式编程的支持(新增Springweb Flux模块)。
Springweb Flux同时支持使用旧 的SpringMVC注解声明Reactive Controol和传统的MVC Controllor不同。Reactive Controol操作的是非阻塞的ServerHttpRequest和ServerHttpResponse(服务于服务之间的通信有两种:
一种是同步:Http,RPC
一种是异步:消息队列,消息队列和Spring没什么关系,因为Spring没有提供任何消息队列,那怎么做到非阻塞的传输通信呢?用ServerHttpRequest,ServerHttpResponse)
而不再是SpringMVC里的HttpServletRequest和HttpServletResponse。
至此也代表这Java正式迎来了响应式异步编程
Spring Boot简介
随着动态语言的流行(Ruby,Groovy,Scala,Nodejs),Java的开发显得格外笨重,繁多的配置,低下的开发效率,运行速度很慢,复杂的部署流程以及第三方技术集成难度大。
在上述环境下,SpringBoot应运而生,他使用‘习惯优于配置’(项目中存在大量的配置,此外还内置了一个习惯的配置,让你无需动手进行配置)的理念让你的项目快速的运行起来,使用Spring Boot很容易创建一个独立运行(运行Jar,内嵌Servlet容器(Tomcat))准设国产级别的基于Spring框架的项目,使用SpringBoot你可以不用或者只需很少的Spring配置。
*Spring Boot可以创建一个独立运行的Jar包,让Java程序成为开箱即用的特性。
Spring Boot优缺点
优点
-
快速构建项目
-
对主流开发框架的五配置集成
-
项目可独立运行,无需外部以来Servlet容器
-
提供运行时的应用监控
-
极大的提高了开发,部署效率
-
与云计算的天然集成
缺点
- 版本迭代速度很快,一些模块改动较大
- 由于不用自己做配置,报错时很难定位
- 网上现成的解决方案较少
Spring BootWordCount+单元格测试
WordCount
package com.funtl.hellospringboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
/*@SpringBootApplication程序入口并且在main函数上调用SpringApplication.run方法,就代表这个程序具备了Spring Boot的特性*/
public class HelloSpringBootApplication {
@RequestMapping(value = "", method = RequestMethod.GET)
public String saylli(){
return "Hello Spring Boot";
}
public static void main(String[] args) {
SpringApplication.run(HelloSpringBootApplication.class, args);
}
}
Spring Boot单元格测试
package com.funtl.hellospringboot;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;
import java.net.URL;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat;
/*所以这里的这个测试的主要作用主要知道一点SpringBoot怎么做测试,主要增加两个注解RunWith和SpringBootTest*/
@RunWith(SpringRunner.class)
/*HelloSpringBootApplication.class入口类的class为的就是能够装载到application.yml配置文件*/
@SpringBootTest(classes = HelloSpringBootApplication.class , webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HelloSpringBootApplicationTests {
@LocalServerPort/*本地端口,就是内嵌的Tomcat端口默认是8080*/
private int port;/*通过注解的方式注入这个默认的8080端口(这个端口也可以修改)你启动什么端口,就帮你复制什么端口*/
private URL base;
@Autowired/*Test(Rest的模板)主要作用是用来注入,能够测试MVC(Controller)*/
private TestRestTemplate template;
@Before/*初始化URL:本地地址+端口*/
public void setUp() throws Exception{
this.base = new URL("http://localhost:" + port + "/");
}
@Test
public void contextLoads() {
/*通过ResponseEntity去访问URL地址的时候会得到一个值,这个值就是整个响应回来的Body,也就是访问的内容是什么*/
ResponseEntity<String> response = template.getForEntity(base.toString(), String.class);
/*这里下了一个断言,断言内容一定是Hello Spring boot*/
assertThat(response.getBody(), equalTo("Hello Spring Boot"));
// assertThat(response.getBody(), equalTo("Hello Spring boot"));
}
}
Spring Boot常用配置
自定义Banner
在启动Spring Boot的时候会有一个默认的启动图案
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.1.RELEASE)
在src/main/resources 目录下新建一个Banner.txt
再次运行这个程序
${AnsiColor.BRIGHT_YELLOW}
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\ = /O
____/`---'\____
.' \\| |// `.
/ \\||| : |||// \
/ _||||| -:- |||||- \
| | \\\ - /// | |
| \_| ''\---/'' | |
\ .-\__ `-` ___/-. /
___`. .' /--.--\ `. . __
."" '< `.___\_<|>_/___.' >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-'======
`=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
佛祖保佑 永无BUG
Spring Boot配置文件
Spring Boot项目中使用一个全局的配置文件,application.properties或者是application.yml,在resources目录下或者类路径下的/config下,一般放在resources下。
修改Tomcat的端口为9090,并将默认的访问路径“/”修改为boot,可以在application.properties中添加:
server.prot = 9090
server.context-path = boot
或者在application.yml中添加:
server:
port: 9090
servlet:
context-path: /boot
测试效果
Spring Boot Starter POM
Spring Boot为我们提供了简化企业级开发绝大多数场景的Starter pom,只要使用了应用场景所需要的Starter pom,相关技术配置将会消除,就可以得到Spring Boot为我们提供的自动配置Bean
官方提供的Starter pom
PS:Spring Boot没有配置文件并不是真的没有配置文件,而是Spring帮我们集成了大量的主流框架配置,之所以能依赖到各种项目,是因为我们继承了Spring的超级pom,他帮我们维护了各个版本的依赖关系。
Spring Boot日志配置
Spring Boot 对各种日志框架都做了支持,我们可以通过配置来修改默认的日志配置。
默认情况下,Spring Boot使用LogBack作为日志框架。
配置文件
logging:
file: logs/log.log /** 如果运行后,logs目录没出来进到项目所在的文件夹在返回或者刷新下 **/
关闭特定的自动配置
关闭特定的自动配置使用@SpringBootApplication注解的exclude参数即可,这里关闭数据源的自动配置为例
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
// 我不要自动配置数据源
#Spring Boot踩过的小坑
PS:本文中内容都是根据千峰教育视频中所手打出来的。自己Web基础很差,有些地方可能不是解释的不是很清楚。