Spring Boot--2.why什么使用spirng boot

学习网站:spring boot

Spring Boot的优势

自动配置

根据Classpath中的包自动配置相应的bean.

起步依赖

作用

  • 使用场景
    一般我们开发一个web程序,如果想使用Thymeleaf视图、通过JPA进行数据持久化。
    为了添加Thymeleaf视图和Jpa的支持,我们不得不添加相关依赖,而添加依赖我们不仅需要知道每个依赖的坐标而且还要保证各依赖之间的兼容。光一个一个找这些依赖就比较麻烦了。而且在还没有代码的情况,我们是不知道添加的依赖到底完不完整的。所以开发一个web程序还没写一行代码之前,光是找各种依赖架包就是一个挺麻烦的事情了。而且,如果我们下次再写一个web程序时,好的情况是直接把上次找好的依赖添加过来,坏的情况是,新写的web需要添加新的依赖,而这个依赖很有可能导致和其它依赖版本不兼容,所以还会产生重新找的问题。
  • 起步依赖作用
    如果我们在构建文件里指定这些功能:开发Web程序,使用Thymeleaf视图和Jpa的支持。让构建过程自己搞明白我们需要什么东西,岂不是更简单?这正是Spring Boot起步依赖的功能。

指定基于功能的依赖

  • Spirng Boot通过提供众多起步依赖降低项目依赖的复杂度。起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。 很多起步依赖度额命名都暗示了它们提供的某种或某类功能。
    比如起步依赖spring-boot-starter-web,他是一个package类型为jar的maven项目,项目里除了一个pom.xml文件外没有任何代码文件。而pom.xml里则声明了对各种web开发可能用到依赖。
  • spring-boot-starter-web起步依赖的pom.xml中依赖的声明:
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
    </dependencies>
  • 由此可见,起步依赖是服务于某一类功能的一些依赖的集合,当在项目中声明起步依赖时,通过依赖传递,就相当于声明了其它依赖。再简单点:spring把大部分依赖按照功能进行分类,然后通过起步依赖来管理每一类。每一个起步依赖都代表一类依赖。
  • 举例
    • 你打算做一个阅读列表Web应用程序。与其向项目的构建文件中添加一堆单独库依赖,还不如声明这是一个Web应用程序来的简单。你只要添加Spring Boot的Web起步依赖就好了。
  • 想以Thymeleaf为Web视图,用JPA来实现数据持久化,因此在构建文件中添加Thymeleaf和Spring Data JPA的起步依赖。为了进行测试,还需要能在Spring Boot上下文里运行集成测试的库,因此添加test起步依赖。
    最终添加的依赖如下:
...
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
               <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
...
  • 这4个起步依赖的具体程度恰到好处,我们并没有说想要SpringMVC,只是想说要构建一个Web应用程序。并没有说指定JUnit或其他测试工具,只是所想要测试自己的代码。Thymeleaf和Spring Data JPA的起步依赖稍微具体一点。

  • 如果你想知道自己声明了那些依赖,通过maven构建的项目,可以使用mvn dependency:tree命令来查看依赖树。

  • 起步依赖没有指定版本号,因为起步依赖本身是由正在使用的spring-boot-starter-parent的版本来决定的,而起步依赖的版本则决定它们引入的传递依赖的版本。

  • 当前spring-boot项目-->spring-boot-starter-parent-->spring-boot-dependencies。而在spring-boot-dependencies中的依赖管理中申明了所有起步依赖。所以说起步依赖本身的版本有正在使用的spring-boot-starter-parent的版本决定。

  • spring boot官方起步依赖的命名规则:spring-boot-starter-*。 *代表具体的模块。比如spring-boot-starter-web。这就是web开发的起步依赖。


spring官网的一些摘要

  • Spring Boot provides a number of “Starters” that make easy to add jars to your classpath.

  • 其中spring-boot-starter-parent起步依赖,spring-boot一般都会继承它,它不会往项目中添加任何依赖,它只是提供了一个依赖管理(dependency-management ),这样你就可以不需要为后续的依赖申明版本了。

  • Maven users can inherit from the spring-boot-starter-parent project to obtain sensible defaults. The parent project provides the following features:

  • Java 1.6 as the default compiler level.

  • UTF-8 source encoding.

  • A Dependency Management section, allowing you to omit <version> tags for common dependencies, inherited from the spring-boot-dependencies POM.

  • Sensible resource filtering.

  • Sensible plugin configuration (exec plugin, surefire, Git commit ID, shade).

  • Sensible resource filtering for application.properties and application.yml including profile-specific files (e.g. application-foo.properties and application-foo.yml)

  • spring-boot-starter-parent继承了spring-boot-dependencies

覆盖起步依赖引入的传递依赖

  • 大部分情况下,你都无需关心每个spring boot起步依赖分别声明了些什么东西。Web起步依赖让你构建Web应用程序,Thymeleaf起步依赖让你用Thymeleaf模板。但是即使经过Spring Boot团队的测试,起步依赖里所选的依赖仍有问题怎么办,如何覆盖起步依赖呢?

  • 覆盖起步依赖中通过传递依赖加入的依赖有两种原因:1.起步依赖中声明的依赖我用不到,为了给程序瘦身,在打包的时候我想把没用的依赖都排除掉,比如web起步依赖中声明了jackson依赖,但是这个依赖我在程序中用不到。2.起步依赖中声明的依赖版本不满足要求。

  • 针对第1种情况,如果使用maven构建项目,则使用exclusions标签来排除。

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
         <exclusions>
           <exclusion>
               <groupId>com.fasterxml.jackson.core</groupId>
           </exclusion>
        </exclusions>
    </dependency>  
  • 针对第2中情况:有两种办法
    1:因为所有起步依赖涉及的依赖的版本都在 spring-boot-dependencies
    中声明了,所以可以在当前项目的pom.xml中覆盖之前属性。比如
<properties>
    <spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>

在做这个之前你需要知道你要修改的依赖的版本属性在spring-boot-dependencies中的名称。spring-boot-dependencies ->pom 。遗憾的是,不是每一个依赖的版本在dependencies 都有声明,像web起步依赖中的jackson依赖在dependencies 中就没有关于依赖版本属性的声明,那么它的版本在哪里呢?答:该依赖是dependencies 中声明的某个依赖传递过来的。面对这种情况只能采用第二种办法。
2:根据maven的就近原则。在当前项目中声明该依赖,则传递过来的依赖就会被取代。

<dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>填写你想要的版本</veriosn>
</dependency>

命令行界面

Actuator

Spring Boot程序推荐的代码组织结构


Paste_Image.png

构造函数依赖注入

package com.example.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class DatabaseAccountService implements AccountService {

    private final RiskAssessor riskAssessor;

    @Autowired
    public DatabaseAccountService(RiskAssessor riskAssessor) {
        this.riskAssessor = riskAssessor;
    }

    // ...

}
Notice how using constructor injection allows the riskAssessor field to be marked as final, indicating that it cannot be subsequently changed.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容