01 Spring Boot 入门及环境构建

Spring Boot 入门及环境构建

专栏列表

  1. Spring Boot 入门及环境构建
  2. Spring Boot 配置
  3. Spring Boot 自动配置及原理分析
  4. Spring Boot 日志
  5. SpringBoot Web 开发、Thymeleaf 模版 Spring MVC
  6. SpringBoot RESTful风格的增删改查 CRUD

入门

简介

Spring Boot 来简化 Spring 应用开发,约定大于配置去繁从简,just run 就能创建一个独立的,产品级别的应用。

简化 Spring 应用开发的一个框架;

整个 Spring 技术栈的一个大整合;

J2EE 开发的一站式解决方案;

Spring Boot 对于 Spring 的再次封装

  • 背景

    J2EE 笨重的开发、繁多的配置、低下的开发效率、复杂的部署流程、第三方技术集成难度大。

  • 解决

    “Spring 全家桶”时代。

    Spring Boot --> J2EE 一站式解决方案 --> Spring Cloud 分布式整体解决方案

    image-20200617025519819
  • 优点

    • 快速创建独立运行的 Spring 顶目以及与主流框架集成
    • 使用嵌入式的 Servlet 容器,应用无需打成 WAR 包
    • starters 自动依赖与版本控制
    • 大量的自动配置,简化开发,也可修改默认值
    • 无需配置 XML,无代码生成,开箱即用
    • 准生产环境的运行时应用监控
    • 与云计算的天然集成

历史回顾

事实上,在 Spring 3.0 开始,Spring 官方就已经开始推荐使用 Java 配置来代替传统的 XML 配置了,我们不妨来回顾一下 Spring 的历史:

  • Spring 1.0

    在此时因为 JDK 1.5 刚刚出来,注解开发并未盛行,因此一切 Spring 配置都是 XML 格式,想象一下所有的 bean 都用 XML 配置

  • Spring 2.0

    Spring 引入了注解开发,但是因为并不完善,因此并未完全替代 XML,此时的程序员往往是把 XML 与注解进行结合

  • Spring 3.0

    Spring 3.0 以后 Spring 的注解已经非常完善了,因 Spring 推荐大家使用完全的 Java 配置来代替以前的 XML,不过似乎在国内并未推广行。然后当 SpringBoot 来临,人们才慢慢认识到 Java 配置的优雅。

有句古话说的好:拥抱变化,拥抱未来。所以我们也应该顺应时代潮流,做时尚的弄潮儿,一起来学习下 Java 配置的玩法。

微服务

微服务文档

2014 martin fowler

微服务:架构风格

一个应用应该是一组小型服务;可以通过 HTTP 的方式进行互通

单体应用:ALL IN ONE;

image-20200617025458404

image-20200617025422101

环境约束

安装环境约束

  • JDK 1.8(Spring Boot 1.7 及以上;java version “1.8.0_112”)
  • Maven 3.3(Maven 3.3 以上版本;Apache Maven 3.3.9)
  • Interllij IDEA 2017: Interllij IDEA 2017.2.2 X64, STS
  • Spring Boot 1.5.9 RELEASE: 1.5.9

Maven 配置文件约束

<profiles>
  <profile>
    <id>jdk-1.8</id>
    <activation>
      <activeByDefault>true</activeByDefault>
      <jdk>1.8</jdk>
    </activation>
    <properties>
      <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>
      <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    </properties>
  </profile>
</profiles>

创建 Spring Boot 工程

Maven 依赖导入

  1. 创建普通Maven工程(jar)

  2. 导入依赖 Spring Boot 相关的依赖

    <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.3.0.RELEASE</version>
    </parent>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
    </dependencies>
    <!-- 这个插件,可以将应用打包成一个可执行的 jar 包 -->
    <build>
      <plugins>
        <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
          <!-- <version>2.3.0.RELEASE</version>-->
        </plugin>
      </plugins>
    </build>
    
  3. 编写主程序 启动 Spring Boot 应用

    @SpringBootApplication
    public class Main {
      public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
      }
    }
    
  4. 编写相关的Controller、Service

    以下两种方法作用等同

    • @Controller
    @org.springframework.stereotype.Controller
    public class Controller {
      @ResponseBody
      @RequestMapping("/hello")
      public String hello() {
        return "Hello";
      }
    }
    
    • @RestController
    @org.springframework.web.bind.annotation.RestController
    public class Controller {
      @RequestMapping("/hello")
      public String hello() {
        return "Hello";
      }
    }
    
  5. 运行主程序测试

  6. 简化部署

    <!-- 这个插件,可以将应用打包成一个可执行的 jar 包 -->
    <build>
      <plugins>
        <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
          <!-- <version>2.3.0.RELEASE</version>-->
        </plugin>
      </plugins>
    </build>
    

使用 Spring Initializer 快速创建 Spring Boot 项目

IDE 都支持使用 Spring 的项目创建向导快速创建一个 Spring Boot 项目

选择我们需要的模块;向导会联网创建 Spring Boot 项目

默认生成的 Spring Boot 项目

  • 主程序已经生成好了,我们只需要我们自己的逻辑
  • resources 文件夹中目录结构
    • static:保存所有的静态资源;js css Images
    • templates:保存所有的模板页面(Spring Boots 默认 jar 包使用入式的 Tomcat,默认不支持 JSP 页面)
      • 可以使用模板引
        • freemarker
        • thymeleaf
    • application.properties:Spring Boot 应用的配置文件,可修改默认配置
  1. 创建项目时选择Spring Initializr

    如无法完成则手动上 Spring Initializer Web 完成初始化操作,后导入idea

    创建项目时选择Spring Initializr
  2. 完善项目信息

    完善项目信息
  3. 选择需要的starter

    idea03
  4. 创建完成后 不要的文件可以删除

    1573641023432

POM 研究

  1. 父项目

    <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.3.0.RELEASE</version>
    </parent>
    
    <!-- 依赖父级项目 spring-boot-dependencies -->
    <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>2.3.0.RELEASE</version>
    </parent>
    <!-- 真正管理 Spring Boot 应用里面的所有依赖版本 -->
    

    Spring Boote 的版本仲裁中心

    以后我们导入依赖默认是不需要写版本;(没有在 dependencies 里面管理的依赖自然需要声明版本号)

  2. 导入依赖

    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
    </dependencies>
    
    • spring-boot-starter-web
      • spring-boot-starter:spring-boot 场景启动器;帮我们导入了 web 模块正常运行所依赖的组件;

    Spring Boot 将所有的功能场景都抽取出来,做成一个个的 starters(启动器),只需要在项目里面引入这些 starter 相关场景的所有依赖都会导入进来。(版本由Spring-Boot自动控制)要用什么功能就导入什么场景的启动器。

    • 主程序类,主入口类
    @SpringBootApplication
    public class Main {
      public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
      }
    }
    

    @SpringBootApplication: Spring Boot 应用标注在某个类上说明这个类是 Spring Boot 的主配置类,Spring Boot 就应该运行这个类的 main 方法来启动 Spring Boot 应用

    @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
    
    • @SpringBootConfiguration: Spring Boot 的配置类;
      • 标注在某个类上,表示这是一个 Spring Boote 的配置类
      • @Configuration:配罩类上来标注这个注解
      • 配置类 ---- 配置文件; 配置类也是容器中的一个组件;@Component
    • @EnableAutoConfiguration: 开启自动配置功能;
      • 以前我们需要配置的东西,Spring Boot 帮我们自动配置;@EnableAutoConfiguration 告诉 Spring Boot 开启自动配置功能;这样自动配置才能生效
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage
    @Import(AutoConfigurationImportSelector.class)
    public @interface EnableAutoConfiguration
    
    • @AutoConfigurationPackage: 自动配置包

      • @Import(AutoConfigurationPackages.Registrar.class): Spring 的底层注解@Import,给容器中导入一个组件;导入的组件 AutoConfigurationPackages.Registrar.class 提供
      • 将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到 Spring 容器;
    • @Import(EnableAutoConfigurationlmportSelector.class)

      • 给容器中导入组件?
      • EnableAutoConfigurationlmportSelector:导入哪些组件的选择器
      • 将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中;
      • 会给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给容器中导入这个场景需要的所有组件,并配置好这些组件,有了自动配置类,免去了我们手动编写配置注入功能组件等的工作

      image-20200617014709788

      • SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, classLoader)
      • Spring Boot 在启动的时候从类路径下的 META-INF/spring.factories 中获取 EnableAutoConfiguration 指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作;以前我们需要自己配置的东西,自动配置类都帮我们自动完成;

异常和热部署

idea Spring Boot热部署

idea --> Setting --> Build, Execution, Deployment --> Compiler --> Build project automatically

CHECKED --> Build project automatically

image-20200619234241335

快捷键:

​ Win: Ctrl+alt+shift+/

​ Mac: command+option+shift+/

选择Registry…

image-20200619234454059

CHECKED --> compiler.automake.allow.when.application.running

image-20200619234626498

POM依赖增加对热部署工具的依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <scope>runtime</scope>
</dependency>

Maven 打包异常

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <configuration>
        <skip>true</skip>
      </configuration>
    </plugin>
  </plugins>
</build>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin KDA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值