SpringBoot2.0深度实践学习手记

SpringBoot易学

组件自动装配:规约大于配置,专注于核心业务

外部化配置:一次构建、按需调配,到处运行

嵌入式容器:内置容器、无需部署、独立运行

Spring Boot Starter : 简化依赖、按需装配、自我包容

Production-Ready : 一站式运维、生态无缝整合

SpringBoot难精

组件自动装配:模式注解、@Enable模块、条件装配、加载机制

外部化配置:Environment抽象、生命周期、破坏性变更

嵌入式容器:Servlet Web容器、Reactive Web 容器

Spring Boot Starter: 依赖管理、装配条件、装配顺序

Production-Ready: 健康检查、数据指标、@Endpoint管控

Spring Boot 与 Java EE 规范

  • Web: Servlet (JSR-315、JSR-340)
  • SQL:JDBC(JSR-221)
  • 数据校验:Bean Validation(JSR 303、JSR-349)
  • 缓存:Java Caching API(JSR-107)
  • WebSockets:Java API for WebSocket(JSR-356)
  • Web Services:JAX-WS(JSR-224)
  • Java管理:JMX(JSR 3)
  • 消息:JMS(JSR-914)

核心特性

Spring Boot三大特性

  • 组件自动装配:Web MVC 、Web Flux、JDBC等
  • 嵌入式Web容器:Tomcat、Jetty以及Undertow
  • 生产准备特性:指标、健康检查、外部化配置等

组件自动装配

  • 激活:@EnableAutoConfiguration
  • 配置:/META-INF/spring.factories
  • 实现:XXXAutoConfiguration
  • 代码:@EnableAutoConfiguration
//在SpringBootApplication中也是包含了EnableAutoConfiguration
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

查看源码,包含EnableAutoConfiguration,因此我们直接启动DemoApplication是成功的。

@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}
)}
)
public @interface SpringBootApplication{}

而对于配置文件,在Spring中是大部分存在的。

【图片】

嵌入式Web容器

  • Web Servlet:Tomcat、Jetty和Undertow
  • Web Reactive:Netty Web Server

生产准备特性

  • 指标:/actuator/metrics
  • 健康检查:/actuator/health
  • 外部化配置:/actuator/configprops

Web应用

传统Servlet应用

  • Servlet组件:Servlet、Filter、Listener
  • Servlet注册:Servlet注解、Spring Bean、RegistrationBean
  • 异步非阻塞:异步Servlet、非阻塞Servlet

依赖


    org.springframework.boot
    spring-boot-starter-web

实现

  • 添加@WebServlet注解
  • 根据3.1规范继承HttpServlet
  • URL映射:@WebServlet(urlPatterns = "/my/servlet")
  • 在启动类上加注册:@ServletComponentScan(basePackages = "com.myself.demo.web.servlet")
  • 启动SpringBoot,可以看到
2018-10-10 11:23:56.607  INFO 21788 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Servlet com.myself.demo.web.servlet.MyServlet mapped to [/my/servlet]

异步非阻塞Servlet

  • 启动WebServlet支持异步处理
@WebServlet(urlPatterns = "/my/servlet",asyncSupported = true
  • 启动异步操作,以新线程执行,并在执行后触发完成
//映射、继承HttpServlet编程规范 ,asyncSupported支持异步处理
@WebServlet(urlPatterns = "/my/servlet",asyncSupported = true)
public class MyServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //开始异步操作
        AsyncContext asyncContext = req.startAsync();

        //启动
        asyncContext.start(()->{
            try {
                resp.getWriter().println("Hello,World!");
                //触发完成
                asyncContext.complete();
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }
}
注意:异步较为复杂,以上只是一个简单的实现例子

Spring Web MVC应用

  • Web MVC视图:模版引擎、内容协商、异常处理等
  • Web MVC REST:资源服务、资源跨域、服务发现等
  • Web MVC 核心:核心架构、处理流程、核心组件

Web MVC 视图

  • ViewResolver
  • View
模版引擎
  • Thymeleaf
  • Freemarker
  • JSP
内容协商
  • ContentNegotiationConfigurer
  • ContentNegotiationStrategy
  • ContentNegotiationViewResolver
异常处理

@ExceptionHandler
HandlerExceptionResolver --> ExceptionHandlerExceptionResolver
BasicErrorController(Spring Boot 项目默认错误页)

Web MVC REST

资源服务
  • @RequestMapping
  • @GetMapping
  • @ResponseBody
  • @RequestBody
资源跨域
  • CrossOrigin
  • WebMvcConfigurer#addCorsMappings
  • 传统解决方案(IFrame、JSONP)
服务发现
  • HATEOS

Web MVC 核心

核心架构

//后续补充

处理流程

//后续补充

核心组件
  • DispatcherServlet
  • HandlerMapping
  • HandlerAdapter
  • ViewResolver
  • ...

Spring Web Flux应用(Spring5.0)

  • Reactor基础:Java Lambda、Mono、Flux
  • Web Flux核心:Web MVC注解、函数式声明、异步非阻塞
  • 使用场景:Web Flux优势和限制
Web MVC 注解兼容
  • @Controller
  • @RequestMapping
  • @ResponseBody
  • @RequestBody
函数式声明
  • RouterFunction
异步非阻塞
  • Servlet 3.1 +
  • Netty Reactor
使用场景
  • 页面渲染
  • REST应用
  • 性能测试

Web Server应用

  • 切换Web Server
  • Tomcat -> Jetty(Tomcat的优先级高于Jetty,所以需要剔除Tomcat依赖)

    org.springframework.boot
    spring-boot-starter-web
    
        
        
            org.springframework.boot
            spring-boot-starter-tomcat
        
    




    org.springframework.boot
    spring-boot-starter-jetty
  • 替换Servlet容器 -> WebFlux

//这种情况下,需要先将其他外部服务剔除依赖


    org.springframework.boot
    spring-boot-starter-webflux
  • 自定义Servlet Web Server
Web ServerFactoryCustomizer
  • 自定义Reactive Web Server
ReactiveWebServerFactoryCustomizer

数据相关

  • JDBC:数据源、JDBCTemplate、自动装配
  • JPA:实体映射关系、实体操作、自动装配
  • 事务:Spring事务抽象、JDBC事务处理、自动装配

JDBC

依赖

    org.springframework.boot
    spring-boot-starter-jdbc
数据源
  • javax.sql.DataSource

JDBCTemplate

自动装配
  • DataSourceAutoConfiguration

JPA

依赖

    org.springframework.boot
    spring-boot-starter-data-jpa
实体映射
  • @javax.persistence.OneToOne
  • @javax.persistence.OneToMany
  • @javax.persistence.ManyToOne
  • @javax.persistence.ManyToMany
实体操作
  • javax.persistence.EntityManager
自动装配
  • HibernateJpaAutoConfiguration

事务(Transaction)

依赖

    org.springframework
    spring-tx
Spring事务抽象
  • PlatformTransactionManager
JDBC事务抽象
  • DataSourceTransactionManager
自动装配
  • TransactionAutoConfiguration

功能扩展

Spring Boot 应用

  • SpringApplication:失败分析、应用特性、事件监听等
  • Spring Boot 配置:外部化配置、Profile、配置属性
  • Spring Boot Starter:Starter开发、最佳时间

分析报告

  • FailureAnalysisReporter

应用特性

  • SpringApplication Fluent API
//二者等价
new SpringApplicationBuilder(DemoApplication.class).run(args);
//SpringApplication.run(DemoApplication.class, args);

Spring Boot 配置

  • 外部化配合 -> ConfigurationProperty
  • @Profile
  • 配置属性 -> ProperySources

运维管理

Spring Boot Actuator

  • 端点:各类Web 和 JMX Endpoints
  • 健康检查:Heath、HealthIndicator
  • 指标:内建Metrics、自定义Metrics
依赖

    org.springframework.boot
    spring-boot-starter-actuator
端点(Endpoints)
  • web Endpoints
  • JMS EndPoints
健康检查(Health Checks)
  • Health
  • HealthIndicator
指标(Metrics)
  • 内建 Metrics -> Web Endpoint: /actuator/metrics
  • 自定义Metrics

如果本文对你有所帮助,欢迎关注个人技术公众号

图片描述

你可能感兴趣的:(springboot,学习笔记,jetty,tomcat,源码学习)