Spring Boot 入门及环境构建
专栏列表
- Spring Boot 入门及环境构建
- Spring Boot 配置
- Spring Boot 自动配置及原理分析
- Spring Boot 日志
- SpringBoot Web 开发、Thymeleaf 模版 Spring MVC
- SpringBoot RESTful风格的增删改查 CRUD
文章目录
入门
简介
Spring Boot 来简化 Spring 应用开发,约定大于配置去繁从简,just run 就能创建一个独立的,产品级别的应用。
简化 Spring 应用开发的一个框架;
整个 Spring 技术栈的一个大整合;
J2EE 开发的一站式解决方案;
Spring Boot 对于 Spring 的再次封装
-
背景
J2EE 笨重的开发、繁多的配置、低下的开发效率、复杂的部署流程、第三方技术集成难度大。
-
解决
“Spring 全家桶”时代。
Spring Boot --> J2EE 一站式解决方案 --> Spring Cloud 分布式整体解决方案
-
优点
- 快速创建独立运行的 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;
环境约束
安装环境约束
- 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 依赖导入
-
创建普通Maven工程(jar)
-
导入依赖 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>
-
编写主程序 启动 Spring Boot 应用
@SpringBootApplication public class Main { public static void main(String[] args) { SpringApplication.run(Main.class, args); } }
-
编写相关的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"; } }
-
运行主程序测试
-
简化部署
<!-- 这个插件,可以将应用打包成一个可执行的 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 应用的配置文件,可修改默认配置
-
创建项目时选择Spring Initializr
如无法完成则手动上 Spring Initializer Web 完成初始化操作,后导入idea
-
完善项目信息
-
选择需要的starter
-
创建完成后 不要的文件可以删除
POM 研究
-
父项目
<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 里面管理的依赖自然需要声明版本号)
-
导入依赖
<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);就是给容器中导入这个场景需要的所有组件,并配置好这些组件,有了自动配置类,免去了我们手动编写配置注入功能组件等的工作
- SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, classLoader)
- Spring Boot 在启动的时候从类路径下的 META-INF/spring.factories 中获取 EnableAutoConfiguration 指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作;以前我们需要自己配置的东西,自动配置类都帮我们自动完成;
- spring-boot-starter-web
异常和热部署
idea Spring Boot热部署
idea --> Setting --> Build, Execution, Deployment --> Compiler --> Build project automatically
CHECKED --> Build project automatically
快捷键:
Win:
Ctrl+alt+shift+/
Mac:
command+option+shift+/
选择Registry…
CHECKED --> compiler.automake.allow.when.application.running
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>