(二):Spring Boot入门

Spring Boot入门

1: 介绍

spring boot是基于spring框架搭建起来的服务器应用框架,它嵌入Tomcat, Jetty或者Undertow等服务器,并且不需要传统的WAR文件进行部署。可以把它看成服务器总spring框架的一列整合,省去了我们很多配置等工作。可以帮助我们快速建立一个产品级别的企业级应用。

1.1:原有的spring开发

在原有的spring项目开发中,我们使用spring的组件建立工程后需要进行大量的项目配置,结合maven导入大量的jar包才能让我们的程序启动起来,大量的配置使程序员的工作配置大于开发,这给我们造成了很不好的体验,想要详细了解可以学习spring的开发,学习spring项目的开发并不会让我们重复造车,spring boot是基于spring的这样会使我们更好的理解spring boot。

1.2:现有的spring开发

从spring的全家桶时代,到现在的spring boot(JavaEE一站式解决方案)、spring cloud(分布式整体解决方案),给我们的开发提供了极大的便利,让我们精力都集中在开发上,避免了大量的配置。

1.3:优点

  • 创建独立的spring应用程序
  • 嵌入Tomcat、Jetty、Undertow,无需部署WAR文件
  • 允许通过maven来根据需要获取starter
  • 尽可能的自动给配置spring,简化开发,也可修改默认配置。
  • 提供生产就绪型功能,如指标、健康检查和外部部署
  • 绝对没有代码生成,对xml没有配置要求。

1.4:缺点

spring boot最大的缺点就是入门容易精通难,在后台服务庞大的工程中,虽然spring boot为为我们带来的便利,但同样深层次的服务器问题也难暴露出来给我们处理,这样就造成了我们需要非常精通spring boot并且了解真个服务器的框架才能更好的完成我们的工作。

1.5:大时代背景(微服务)

微服务的概念在2014年被提出,微服务可以理解为一组小型服务的集合,每一个小型服务都运行在自己的进程内,服务与服务之间通过HTTP进行轻量级通信,每个服务都只专注与自己的设计目标,这样让开发更简介,微服务整体对外进行服务,访问通过网关来分析访问的是那个服务来进行分发。spring boot就是微服务的一站式解决方案。

2:Spring Boot HelloWorld

2.1: 创建工程

熟悉maven的和IDE的可以直接在IDE中创建Spring Boot工程,还可以在start.spring.io网站上建立工程后导入IDE。本人用的idea.。
导入后的文件目录

2019-01-17 13-29-53屏幕截图.png

  • resources
    • startic:保存所有静态资源:js,css,jsp
    • templates:用来保存所有的模板页面,
  • application.properties:spring boot项目的配置文件。可以修改项目的默认配置。

2.2:项目介绍

spring boot为我们提供了很多starter,这些starter是一些模块的依赖集合,我们不再需要一个一个jar的手动导入,而只需要导入spring提供的starter就可以将整个我们需要的模块依赖导入进来,
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <!--导入spring boot的parent,使用spring boot都需要导入这个,它确定了
        你引入的spring boot模块的版本信息等,它为我们解决了依赖冲突等问题。-->
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.tian.learn</groupId>
    <artifactId>SpringBoot-Learn</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringBoot-Learn</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <!--我们是一个web工程,导入spring boot的web依赖模块-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <!--导入spring boot的单元测试依赖模块-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <!--引入springboot的maven插件-->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

程序的配置文件
在resource目录下application.properties文件是这个项目的配置文件,在spring boot中绝大多数配置是spring为我们自动配置的默认配置,但我们也可以在这个文件中对默认配置进行修改,例如启动项目的端口号等。现在这个文件什么内容都没有
程序的入口
程序的入口就是Java源代码目录的 xxxApplication.java文件中,xxx一般为你的项目名,

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
*该注解标记了该类为spring boot的程序入口类,
*一个spring boot项目该注解只能存在在一个类里
*/
@SpringBootApplication
public class SpringBootLearnApplication {
    /**
    * main函数入口,这里将拉起我们的spring boot项目,里面只有一套语句。
    */
    public static void main(String[] args) {
        SpringApplication.run(SpringBootLearnApplication.class, args);
    }

}

2.3:开发第一HelloWorld

spring boot入门简单就在于它的开发简单,学习起来特别快,在Java源代码目录新建文件HelloWorld.java,创建helloWorld访问。

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//注解标注这个类为RestControl,稍后会详细介绍
@RestController
public class HelloWorld {
    //注解标定访问的相对路径。
    @RequestMapping("/helloworld")
    public String hello(){
        return "hello world";
    }
}

2.4:运行

spring boot中默认集成了Tomcat的内容,所以这里我们不再需要发布我们的项目到Tomcat,直接运行即可,也可以将它打包成jar包,使用Java命令执行。
直接运行我们的程序入口main函数
如果没有配置项目就是localhost:8080:我们的相对路径是helloworld,所以浏览器的全路径就是
localhost:8080/helloworld, 查看结果。
使用maven的package命令打包jar
将项目打包成jar后,我们可以直接运行jar,命令:Java -jar 生成的包名

3:项目详解

@SpringBootApplication

spring boot应用标注在某个类上,说明这个类是springboot的主配置类,也是入口类,springboot就可以运行该类的main方法启动SpringBoot应用

//@SpringBootApplication的定义
@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 {
  • 前四个注解都是Java的类注解,不了解的可以重新学习一下Java注解

  • SpringBootConfiguration : SpringBoot的配置类

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Configuration
    public @interface SpringBootConfiguration {
    }
    

    @configuration:原Spring注解,标记配置类,原spring开发有很多配置文件,现在springboot将配置文件都替换为配置类。它也是容器中的一个组件。

  • @EnableAutoConfiguration:开启自动配置功能
    以前我们spring开发配置许多参数,这个注解告诉springboot自动配置默认参数,有这个注解才能使自动配置生效。

    @AutoConfigurationPackage
    @Import({AutoConfigurationImportSelector.class})
    public @interface EnableAutoConfiguration {
    
    • @AutoConfigurationPackage:自动配置包:

      @Import({AutoConfigurationPackages.Registrar.class})
      public @interface AutoConfigurationPackage {
      }
      

      这个import注解是spring的底层注解,给容器导入一个组件Registrar,查看源码可以看到
      这个组件是将我们主配置类(@SpringBootAplication)所在包及所有子包下的所有组件都扫描到spring boot容器中。

    • @import({AutoConfigurationImportSelector.class}):
      给容器导入AutoConfigurationImportSelector组件,作用是将所有需要导入的组价以全类名的方式返回,这些组件会被添加到容器中,导入的组件为非常多的自动配置类(xxxAutoConfiguration),总结就是给容器中导入这个场景需要的组件,并配置好组件。
      有了这些自动配置类,免去了我们手动编写配置注入功能组件等工作
      主要函数为

      List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
                      getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
      

      这个方法使用getSpringFactoriesLoaderFactoryClass-->EnableAutoConfiguration.class
      getBeanClassLoader为一个类加载器,其中从loadFacortyNames函数中可以看到加载器是从META-INF/spring.facroties(spring-boot-autoconfigure包下)文件中读取配置类的全类名,再通过类加载器来加载的。

4:Spring Boot配置

4.1 配置文件

spring boot默认全局配置文件有两种。配置文件放在src/main/resources或 类路径/config下

  • application.properties
  • application.yml
    作用是修改spring boot自动配置配置的默认配置,Spring boot读取文件在底层为我们自动配置好
    yml为YAML文件,关于YAML 文件的语法可以百度搜,很简单,也可以看我的另一篇文章
#配置启动的串口号
server.port=8888

4.2:YAML文件在spring boot中的使用

参考另一篇文章YMAL

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

推荐阅读更多精彩内容