资讯专栏INFORMATION COLUMN

SpringBoot2.0深度实践学习手记

赵连江 / 2271人阅读

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


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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/35620.html

相关文章

  • 基于 SpringBoot2.0+优雅整合 SpringBoot+Mybatis

    摘要:基于最新的,是你学习的最佳指南。驱动程序通过自动注册,手动加载类通常是不必要。由于加上了注解,如果转账中途出了意外和的钱都不会改变。三的方式项目结构相比于注解的方式主要有以下几点改变,非常容易实现。公众号多篇文章被各大技术社区转载。 Github 地址:https://github.com/Snailclimb/springboot-integration-examples(Sprin...

    gghyoo 评论0 收藏0
  • 数人云工程师手记 | 容器日志管理实践

    摘要:容器内文件日志平台支持的文件存储是,避免了许多复杂环境的处理。以上是数人云在实践容器日志系统过程中遇到的问题,更高层次的应用包括容器日志分析等,还有待继续挖掘和填坑,欢迎大家提出建议,一起交流。 业务平台每天产生大量日志数据,为了实现数据分析,需要将生产服务器上的所有日志收集后进行大数据分析处理,Docker提供了日志驱动,然而并不能满足不同场景需求,本次将结合实例分享日志采集、存储以...

    saucxs 评论0 收藏0
  • 袋鼠云研发手记 | 开源·数栈-扩展FlinkSQL实现流与维表的join

    摘要:所以要用实现流与维表的分两步一用实现维表的功能要实现维表功能就要用到这个功能,是由阿里巴巴贡献给的。是由阿里巴巴贡献给社区的,于版本引入,主要目的是为了解决与外部系统交互时网络延迟成为了系统瓶颈的问题。 showImg(https://segmentfault.com/img/bVbqZJE?w=583&h=123); 作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%...

    张红新 评论0 收藏0
  • Python爬虫建站入门手记——从零开始建立采集站点(一:环境搭建)

    摘要:从今天起,我将在这里更新一个系列的简单爬虫到建立网站的实践手记。内容将会从最简单的开始,环境搭建,基本爬虫,入库,用建立可供用户访问的网站,网站部署。第一部分,买,装环境。我们爬虫站点的所有文件都放在里面。 从今天起,我将在这里更新一个系列的python简单爬虫到建立网站的实践手记。 内容将会从最简单的开始,环境搭建,基本爬虫,入库,用Django建立可供用户访问的网站,网站部署。 ...

    HackerShell 评论0 收藏0
  • 工程师手记:Cassandra在风控数据处理中的应用实践

    摘要:是一套开源分布式数据库系统。的应用场景具有常见分布式数据库,其自带的命令行工具完备,兼容性强,甚至机器都可以安装,因此维护升级都相对比较简单。使用数据的字节进行有顺分区。 Cassandra是一套开源分布式NoSQL数据库系统。由Facebook开发,主要用于储存收件箱等简单格式数据,集GoogleBigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身。2008...

    zxhaaa 评论0 收藏0

发表评论

0条评论

赵连江

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<