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.。
导入后的文件目录
- 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