SpringBoot2.0深度實踐學習手記

SpringBoot易學

組件自動裝配:規約大於配置,專一於核心業務

外部化配置:一次構建、按需調配,處處運行java

嵌入式容器:內置容器、無需部署、獨立運行web

Spring Boot Starter : 簡化依賴、按需裝配、自我包容spring

Production-Ready : 一站式運維、生態無縫整合sql

SpringBoot難精

組件自動裝配:模式註解、@Enable模塊、條件裝配、加載機制

外部化配置:Environment抽象、生命週期、破壞性變動編程

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

Spring Boot Starter: 依賴管理、裝配條件、裝配順序緩存

Production-Ready: 健康檢查、數據指標、@Endpoint管控tomcat

Spring Boot 與 Java EE 規範

  • Web: Servlet (JSR-31五、JSR-340)
  • SQL:JDBC(JSR-221)
  • 數據校驗:Bean Validation(JSR 30三、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中是大部分存在的。app

【圖片】

嵌入式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

依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

實現

  • 添加@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依賴)
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <!-- Exclude the Tomcat dependency -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- Use Jetty instead -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
  • 替換Servlet容器 -> WebFlux

//這種狀況下,須要先將其餘外部服務剔除依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
  • 自定義Servlet Web Server
Web ServerFactoryCustomizer
  • 自定義Reactive Web Server
ReactiveWebServerFactoryCustomizer

數據相關

  • JDBC:數據源、JDBCTemplate、自動裝配
  • JPA:實體映射關係、實體操做、自動裝配
  • 事務:Spring事務抽象、JDBC事務處理、自動裝配

JDBC

依賴
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
數據源
  • javax.sql.DataSource

JDBCTemplate

自動裝配
  • DataSourceAutoConfiguration

JPA

依賴
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
實體映射
  • @javax.persistence.OneToOne
  • @javax.persistence.OneToMany
  • @javax.persistence.ManyToOne
  • @javax.persistence.ManyToMany
實體操做
  • javax.persistence.EntityManager
自動裝配
  • HibernateJpaAutoConfiguration

事務(Transaction)

依賴
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
</dependency>
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
依賴
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
端點(Endpoints)
  • web Endpoints
  • JMS EndPoints
健康檢查(Health Checks)
  • Health
  • HealthIndicator
指標(Metrics)
  • 內建 Metrics -> Web Endpoint: /actuator/metrics
  • 自定義Metrics

若是本文對你有所幫助,歡迎關注我的技術公衆號

圖片描述

相關文章
相關標籤/搜索