Spring Boot 2.1.6 版
与时俱进是每一个程序员都应该有的意识,当一个 Java 程序员在当代步遍布的时候,你就行该想到我能多学点
什么。可观的是后端的框架是稳定的,它们能够维持更久的时间在应用中,而不用担心技术的更新换代。但是类似
SSH,SSM 这些框架已经太久了,人们迫不及待地想使用更为优雅而又简便的框架来代替,所以 SpringBoot 运用而
生。
Spring Boot 是 Spring 家族中的一个全新的框架,它用来简化 Spring 应用程序的创建和开发过程。采用 Spring
Boot 可以非常容易和快速的构建基于 Spring 框架的应用程序,它让编码变简单,配置变简单,部署变简单,监控
变简单。正因为 Spring Boot 能够化繁为简,让开发变得极其快捷,所以在业界备受关注。目前 Spring Boot 在国内
的关注趋势也日渐超过 Spring。
学习条件
SpringBoot 框架是应用在 Spring Framework 框架的基础上,对 Spring Framework 框架的进行优化和升级成
为了新的框架。既 SpringBoot 是构建在 Spring Framework 框架的基础之上,所以想要学好 SpringBoot-那么你肯
定要掌握 Spring Framework。
介绍
Spring Boot 概述
Spring 框架功能很强大,但是就算是一个很简单的项目,我们也要配置很多东西。因此就有了 Spring Boot 框
架,它的作用很简单,就是帮我们自动配置。Spring Boot 框架的核心就是自动配置,只要存在相应的 jar 包,
Spring 就帮我们自动配置。如果默认配置不能满足需求,我们还可以替换掉自动配置类,使用我们自己的配置。
Spring Boot 不是对 Spring 的增强,而是一个快速使用 Spring 进行开发的框架。==Spring Boot 旨在帮助开发者快 ==
== 速搭建 Spring 框架 ==
使用 Spring Boot 可以很容易创建一个独立运行 (运行 jar,内嵌 servlet 容器)、准生产级的基于 Spring 框架的项
目,使用 Spring Boot 我们可以不用甚至只需要很少的 Spring 配置。另外,Spring Boot 还集成了嵌入式的 Web 服务
器,系统监控等很多有用的功能,让我们快速构建企业级应用程序。
== 微服务是未来发展的趋势,Spring Boot 是项目微服务化发展的基石。==
以上观点也是我们为什么要学习 SpringBoot 的关键点。
Spring Boot 核心功能
独立运行的 Spring 项目
Spring Boot 可以以 jar 包形式直接运行,如 java -jar xxx.jar
优点是:节省服务器资源
内嵌 Tomcat 和 Jetty 容器
Spring Boot 可以选择内嵌 Tomcat,Jetty,这样我们无须以 war 包形式部署项目。
提供一个 starter POMs 来简化 Maven 配置
例如引入 spring-boot-starter-web 时会自动引入
spring-boot-starter-parent 是一个特殊 Start,它用来提供相关的 Maven 依赖项,使用它之后,常用的包依
赖可以省去 version 标签。
自动配置 Spring
Spring Boot 会根据在类路径中的 jar 包,类,为 jar 包里的类自动配置 Bean,这样会极大减少我们要使用的配
置。当然 SpringBoot 只考虑了大部分开发场景,并不是所有的场景,如果在实际的开发中我们需要自动配置
Bean,而 Spring Boot 不能满足,则可以自定义自动配置。
准生产的应用监控
Spring Boot 提供基于 http,ssh,telnet 对运行时的项目进行监控。
无代码生成和 xml 配置
Spring Boot 大量使用 spring4.x 提供的注解新特性来实现无代码生成和 xml 配置。spring4.x 提倡使用 Java 配
置和注解配置组合,而 Spring Boot 不需要任何 xml 配置即可实现 spring 的所有配置。
综上我们可以得出:Spring Boot 让开发变得简单,让部署变得简单,让监控变得简单,让配置变得更简单。
快速入门
Spring Boot 2.1.6.RELEASE 需要 Java 8,并且与 Java 11 兼容(包括在内)。
还需要 Spring Framework 5.1.8.RELEASE 或更高版本。
第一个 Spring Boot 项目
创建项目
编写 pom.xml
根据官网 Spring Boot 文档提示从 spring-boot-starter-parent
项目继承并向一个或多个 Starters
声
明依赖项。Spring starter 是 Spring Boot 的核心,可以理解为一个可拔插式的插件,例如,你想使用 Reids 插
件,那么可以使用 spring-boot-starter-redis;如果想使用 MongoDB,可以使用 spring-boot-starter-data-
mongodb。
<!-- 引入 springboot 父类依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<dependencies>
<!-- springboot-web 组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
HelloWorld
HelloWorldController.java
package com.springboot.controller;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
// 表示该服务接口全部返回 json 格式 默认每个方法都加了 @ResponseBody
@RestController
// 表示所扫描到的服务
@EnableAutoConfiguration
public class HelloWorldController {@RequestMapping("/hello")
public String hello() {return "hello";}
@RequestMapping("/getMap")
public Map<String, Object> getMap() {Map<String, Object> resultMap = new HashMap<>();
resultMap.put("code", "200");
resultMap.put("msg", "成功");
return resultMap;
}
// 主函数运行 springboot 项目
public static void main(String[] args) {SpringApplication.run(HelloWorldController.class, args);
}
}
结果
......
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
(()\___ | '_ |'_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| |) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.10.RELEASE)
......
...Registering beans for JMX exposure on startup
...Tomcat started on port(s): 8080 (http)
...Started HelloWorldController in 5.806 seconds (JVM running for 10.606)
Spring Boot 第二种启动方式
项目中肯定不止一个 Controller,我们当然希望项目启动时将所有的 Controller 全部加载进来,这种情况又
该如何配置呢?比如此时有两个 Controller,都需要被执行。
HelloWorldController.java
package com.springboot.controller;
import org.springframework.boot.SpringApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class HelloWorldController {@RequestMapping("/hello")
public String hello() {return "hello";}
@RequestMapping("/getMap")
public Map<String, Object> getMap() {Map<String, Object> resultMap = new HashMap<>();
resultMap.put("code", "200");
resultMap.put("msg", "成功");
return resultMap;
}
}
IndexController.java
package com.springboot.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class IndexController {@RequestMapping("/index")
public String index() {return "index";}
}
App.java
package com.springboot.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
// 扫描指定包下的服务
@ComponentScan("com.springboot.controller")
// 表示所扫描到的服务
@EnableAutoConfiguration
public class App {
// 项目中不需要有多个 main 方法只需要有一个入口就可以了
public static void main(String[] args) {
// 主函数运行 springboot 项目
SpringApplication.run(App.class, args);
}
}
删除其他服务的主函数 main(),只保留一个即可。
并且删除其他服务的 @EnableAutoConfiguration
注解,只在主函数服务中添加。
通过 @ComponentScan
注解扫描你需要的服务。
启动 App.java,其他两个服务也可以访问到了。
Spring Boot 第三种启动方式
开发中,我们经常使用以下 3 个注解注解 main 类。
分别是 @Configuration
,@EnableAutoConfiguration
,@ComponentScan
。由于这些注解一般都是一
起使用,Spring Boot 便提供了一个统一的注解 @SpringBootApplication
。
需要注意的是:@SpringBootApplication
只能扫描同级包下。
不同包下的可以使用 @SpringBootApplication
结合 @EnableAutoConfiguration
,
@ComponentScan
扫描注入。
其中 @ComponentScan
很有用,可以通过该注解指定扫描某些包下包含如下注解的 Beans:
@Component
,@Service
,@Repository
,@Controller
,@Entity
等等均自动注册为 Spring Beans。
App.java
package com.springboot.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
// 相当于 @ComponentScan("com.springboot.app") 只扫描同级包下
// 解决办法提升当前 App 类的包范围 ("com.springboot"),或者结合 @ComponentScan 使用
@SpringBootApplication
// 扫描指定包下的服务
@ComponentScan("com.springboot.controller")
public class App {
// 项目中不需要有多个 main 方法只需要有一个入口就可以了
public static void main(String[] args) {
// 主函数运行 springboot 项目
SpringApplication.run(App.class, args);
}
}