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优缺点

优点

  1. 快速构建项目

  2. 对主流开发框架的五配置集成

  3. 项目可独立运行,无需外部以来Servlet容器

  4. 提供运行时的应用监控

  5. 极大的提高了开发,部署效率

  6. 与云计算的天然集成

缺点

  1. 版本迭代速度很快,一些模块改动较大
  2. 由于不用自己做配置,报错时很难定位
  3. 网上现成的解决方案较少

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基础

Spring Boot Starter POM

Spring Boot为我们提供了简化企业级开发绝大多数场景的Starter pom,只要使用了应用场景所需要的Starter pom,相关技术配置将会消除,就可以得到Spring Boot为我们提供的自动配置Bean

官方提供的Starter pom

https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/reference/html/using-boot-build-systems.html#using-boot-starter

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踩过的小坑
Spring Boot基础

PS:本文中内容都是根据千峰教育视频中所手打出来的。自己Web基础很差,有些地方可能不是解释的不是很清楚。