• Spring Boot 是如何简化Java 开发的
  • SpringBoot的一些重要特征

长久以来,Spring 框架作为Java应用开发的框架地位稳固。最近在云计算、大数据、无结构数据持续化、函数式反应型编程和C端应用开发等方面,Spring生态内部成果不断,比较火爆的当属pring Boot。Spring Boot 提供了一种最小化配置的Java应用开发模式。Spring Boot大大简化了应用的配置,让程序员更加敏捷的开发,将更多的精力放在业务处理上。

Spring是通过依赖注入和面向切面编程,给POJO赋予了EJB的能力,替代了笨重的J2EE,成为轻量级的企业级Java应用开发框架。但是Spring的轻量级指的是POJO的轻量级,在配置方面还是很重。Spring 2.5 时代使用笨拙的XML文件作为配置,后来引入了Annotation(注解),情况开始改观。Spring 3.0 引入了基于Java的配置,作为一种类型安全、可重构的XML的替代配置方式,进步不小。但是,用Spring繁重的配置还是跑不了的。比如使用事务管理、Spring-MVC 还是需要特定的配置;使用第三方的模板渲染要引入特定的包;定制Servlet和Filter需要配置web.xml文件;凡此种种。Spring归根结底还是需要各种配置。。。

想想看,写代码的时候想着这个东西要用起来要先配置,业务逻辑写到一半,搞半天配置回来接着干;然后又遇到和什么东西还要再去配置一把。码农写东西还是比较忌讳来回这种切换的,而且配置很多都是体力活儿,配置写错了,调试的时候也是个坑。还有就是pom管理,每引入一个新的包都胆战心惊,冲突了要解决,一次解决不完还要来第二次,第三次。。。要是个老掉牙的工程,高冲突都能得搞到抑郁症。这些都是生产力杀手。

Spring Boot 来了,某种程度上,码农得救了。

俯瞰Spring Boot

假设现在写一个Web版本的Hello World。最少也要做下面几件事(也可以Google一下具体的创建过程)

  1. 用Maven(或者Gradle)创建一个工程架子,当然了Web应用的话,Spring MVC Servlet API的依赖肯定要在POM文件里面写好。
  2. 配置下web.xml(或者 WebApplicationInitializer 的 Implementation),声明Spring 的DispatcherServlet。
  3. 配置Spring,启用Spring MVC。
  4. 写一个处理Http请求的Controller。
  5. 准备一个Tomcat(或者WebLogic等)来承载当前的服务。

上面这些步骤,除了Controller的编写,其他的都和具体的业务没有直接关系。既然其他的步骤都是统一的,为什么不让工具或者框架帮助程序员做了呢?Spring Boot 某种意义上是可以做到的。举个例子(来自 Spring Boot In Action):写一个 HelloWorld 的Controller,使用Spring Boot的 CLI(Commond Line Interface)运行一下就可以了。

@RestController
class HelloController{
@RequestMapping("/")
def hello() {
return "Hello World".
}
}

Controller 写好后 用下面的命令执行一下就OK了。(具体的安装、使用CLI 后续慢慢写,现在就是知道下用Spring Boot开发,只要写好Controller,就可以运行的,编译都内置了)

$spring run HelloWorldController.groovy

 剖析Spring Boot

Spring Boot 简化Java应用开发的手段有很多,核心内容有四个方面:

  • 自动配置 -- Spring Boot 可以自动将应用中经常用到的、必要的配置完成。
  • 完备的 starter 依赖 -- 程序员将应用中所需的功能告诉Spring Boot,Spring Boot 就可以将这个功能所需的依赖自动加进来。
  • 命令行的运行 -- 这个可选的特性允许你只实现业务逻辑,就可以将整个应用运行起来,基本的工程框架都不需要(当然一般情况下,工程框架还是要有的)。
  • 执行器 -- Actuator 提供整个应用的具体运行细节。

四个特点都通过各自的途径简化应用的开发。

AUTO-CONFIGURATION

在任意一个Java应用中,都可以找到一些XML形式或者Java形式的配置,这些配置负责启用某些功能或者提供某种特性。比如一个使用了JDBC进行数据库操作的应用,配置JdbcTemplate的形式看起来都差不多,类似下面的形式:

@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}

当然这个时候一个 DataSource的实例需要注入到JdbcTemplate 中,假设DataSource 选用Spring内置的H2的数据库,那么DataSource 的代码差不多是下面这样的:

@Bean
public DataSource dataSource() {
return new EmbeddedDataSourceBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScripts('schema.sql','data.sql')
.build(); }

上面这些代码就是Spring 冗余配置的典型代表。数据库的CURD在几乎所有的应用里都会用的到,简而言之这些代码都是套路,既然是套路当然可以交给Spring Boot 来做,这些套路包括但不限于 JPA、安全、SpringMVC 等等。具体的用法后续慢慢写。

    STARTER DEPENDENCY

为工程添加依赖是个很有挑战的任务,具体需要哪些包?这些包的groupId 和 artifactId 是什么?选啥版本好呢?这个版本的包或者这个包本身与工程内部已有的包能不能和平共处不冲突呢?这些都不好说。。Spring Boot 通过 starter 依赖在一定程度上解决了这些问题。starter的本质是利用Maven或者Gradle 的传递依赖特性,通过一系列的 starter 的依赖将常用的包引入到工程中,并且保证通过starter引入的包能够保证相互之间是可以很好的工作的。举个例子,SpringMVC需要的包很多,spring-core/spring-web/spring-webmvc/tomcat/jsckson-databind/hibernate-validator等等。如果用starter依赖的话,org.springframework .boot:spring-boot-starter-web 这一个依赖就好了。

当让starter提供不仅限于传递依赖。其实引入了 web starter 也就说这个应用是个web应用,想要使用jpa就引入jpa starter,想要安全的包就引入 security starter 等等。这个时候要考虑的是这个工程需要什么,不需要再想具体需要哪些具体的包了。

    THE COMMOND-LINE INTERFACE

除了以上两点外,Spring Boot 还提供了一种快速实现Spring 应用的方式 Spring Boot CLI。SpringBoot CLI 将自动化配置、starter 依赖的事情都承担起来,程序员只要关注业务逻辑实现就好了。$spring run HelloWorldController.groovy  看下这个命令和上面 Hello World  的Controller的代码,你会发现没有 import 各种包。那么CLI是怎么知道 RequestMapping 和 RestController 来自什么哪些 package?这些类是怎么被加载到classpath的呢?简单来说:Spring Boot 检测到这些类被用到了,这个时候Spring Boot 根据检测到的类就可以知道哪些哪些Starter 依赖需要被加载,Starter 依赖被加载后,传递依赖的包也会被加载到classpath;一系列的自动配置会被触发,DispatcherServlet Sping MVC 等等也会确保Controller可以响应Controller的HTTP的请求了。

当然SpringBoot的 CLI 是一个可选的特性,如果不能很适应这种比较极端的编程方式,当然可以可以选择比较传统的开发方式。不用Spring Boot的CLI不会影响对 Spring Boot 其他特性的使用。

    THE ACTUATOR

上述特性提供了简化开发的方法,Actuator提供的特性是 让开发者可以清晰观察应用运行时的运行细节。 ACTUATOR 提供两种获取应用运行细节的方式:Web 形式 命令行方式。可以看到的信息大概包括一下几个方面:

  1. Spring Application Context 中被配置的Bean。
  2. Spring Boot 自动配置做了哪些决策。
  3. 应用中启用的环境变量、系统参数、配置属性、可用的命令行命令。
  4. 应用中线程的运行状态。
  5. 提供可视化的内存利用率、垃圾回收、Web 请求、数据源等信息。

关于 Spring Boot 一些说明

(a) Sping Boot 不是应用服务器。Spring Boot 通过一系列的内置的Tomcat 、DataSource、等等来完成应用的启动和部署。是tomcat / Jetty /Weblogic 来提供服务的,并不是Spring Boot 自身。(b) Spring Boot 并没有实现任何的企业级标准。之所以支持JPA或者JMS是因为Spring Boot 在Spring 中间相关的Bean进行了自动配置。(c)Spring Boot 并没有通过生成代码来完成一些特定功能。Spring 做的利用了Spring 4 中提供的 条件化配置 (Conditional Configuration)、Maven (Gradle)的传递依赖特性来实现自身的特性。Spring Boot 做了原本Spring不会帮开发者做的一些标准化、比较无趣的、不和逻辑实现强相关的工作。尽可能将开发者从非业务逻辑工作中解脱出来。

Spring.Boot.1 -- 概览的更多相关文章

  1. thymeltesys-基于Spring Boot Oauth2的扫码登录框架

    thymeltesys thymelte是一个基于Spring Boot Oauth2的扫码登录框架,使用PostgreSQL存储数据,之后会慢慢支持其他关系型数据库.即使你不使用整个框架,只使用其中 ...

  2. 后端开发实践——Spring Boot项目模板

    在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为"第0个迭代"要做的事情.但是,当项目运行了一段时间之后再来反 ...

  3. Spring Boot 非常好的学习资料

    from@https://gitee.com/didispace/SpringBoot-Learning Spring Boot 2.0 新特性学习 简介与概览 Spring Boot 2.0 正式发 ...

  4. Spring Cloud Netflix概览和架构设计

    Spring Cloud简介 Spring Cloud是基于Spring Boot的一整套实现微服务的框架.他提供了微服务开发所需的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策 ...

  5. Spring Boot 测试时的日志级别

    1.概览 该教程中,我将向你展示:如何在测试时设置spring boot 日志级别.虽然我们可以在测试通过时忽略日志,但是如果需要诊断失败的测试,选择正确的日志级别是非常重要的. 2.日志级别的重要性 ...

  6. KubeSphere CI/CD+GitLab+Harbor将Spring Boot项目部署至Kubernetes

    上一篇文章分享了如何在 KubeSphere 对公共的代码仓库 GitHub 和镜像仓库 DockerHub 创建流水线,本文将继续使用 KubeSphere,基于 Harbor 和 GitLab 创 ...

  7. Spring Boot 的单元测试和集成测试

    学习如何使用本教程中提供的工具,并在 Spring Boot 环境中编写单元测试和集成测试. 1. 概览 本文中,我们将了解如何编写单元测试并将其集成在 Spring Boot 环境中.你可在网上找到 ...

  8. Spring Boot 配置元数据指南

    1. 概览 在编写 Spring Boot 应用程序时,将配置属性映射到 Java bean 上是非常有用的.但是,记录这些属性的最好方法是什么呢? 在本教程中,我们将探讨 Spring Boot C ...

  9. Spring Boot2 系列教程(十八)Spring Boot 中自定义 SpringMVC 配置

    用过 Spring Boot 的小伙伴都知道,我们只需要在项目中引入 spring-boot-starter-web 依赖,SpringMVC 的一整套东西就会自动给我们配置好,但是,真实的项目环境比 ...

随机推荐

  1. 黑客常用WinAPI函数整理

    之前的博客写了很多关于Windows编程的内容,在Windows环境下的黑客必须熟练掌握底层API编程.为了使读者对黑客常用的Windows API有个更全面的了解以及方便日后使用API方法的查询,特 ...

  2. SDK介绍

    软件开发工具包(外语首字母缩写:SDK.外语全称:Software Development Kit)一般都是一些软件工程师为特定的软件包.软件框架.硬件平台.操作系统等建立应用软件时的开发工具的集合. ...

  3. 【黑金教程笔记之008】【建模篇】【Lab 07 数码管电路驱动】—笔记

    实验七的目的是设计实现最大为99数字在2个数码管上.采用同步动态扫描.即行信号和列信号同步扫描.这里数码管是共阳极的.选择端口也是共阳极的. 模块: /************************ ...

  4. bzoj 1997: [Hnoi2010]Planar【瞎搞+黑白染色】

    脑补一下给出的图:一个环,然后有若干连接环点的边,我们就是要求这些边不重叠 考虑一下不重叠的情况,两个有交边一定要一个在环内一个在环外,所以把相交的边连边,然后跑黑白染色看是否能不矛盾即可(可能算个2 ...

  5. bzoj 4385: [POI2015]Wilcze doły【单调栈】

    对于每个i,以它为左端点的最优右端点一定是单增的,所以用单调栈维护 具体的,单调栈里放的是和单调的长为d的子段,然后枚举右端点,如果这段的和-当前长为d子段最大的和大于p的话,左端点右移同时注意单调栈 ...

  6. bzoj 2127 happiness【最小割+dinic】

    参考:https://www.cnblogs.com/chenyushuo/p/5144957.html 不得不说这个建图方法真是非常妙啊 假设S点选理,T点选文,a[i][j]为(i,j)选文收益, ...

  7. 【微信公众号开发】根据openId群发消息

    根据开发文档可知,只要使用POST方式提交固定格式的json字符串到那个地址即可.这里我写的是最简单的文本 第一步:建立对应的实体类. package cn.sp.bean; import java. ...

  8. Zygote和System进程的启动过程、Android应用进程启动过程

    1.基本过程 init脚本的启动Zygote Zygote进程的启动 System进程的启动 Android应用进程启动过程 2.init脚本的启动 +------------+ +-------+ ...

  9. android开发学习——Mina框架

    Apache Mina Server 是一个网络通信应用框架,对socket进行了封装. http://www.cnblogs.com/moonandstar08/p/5475766.html htt ...

  10. [BZOJ4815][CQOI2017]小Q的表格 数论+分块

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4815 题目中所给条件中的$(a,a+b)$和$(a,b)$的关系很瞩目. 然后大家都知道$ ...