SpringBoot能快速创建出生产级别的Spring应用,学习SpringBoot我们需要用到它的官方文档:
https://docs.spring.io/spring-boot/docs/current/reference/html/
SpringBoot的系统要求是 Java 8、Maven 3.3+。
接下来我们先进行maven的一些配置,在maven的settings.xml里添加阿里云镜像,能让我们更快地下载所用的包,并设置编译版本,避免一些不必要的错误。
<mirrors>
<mirror>
<id>nexus-aliyunid>
<mirrorOf>centralmirrorOf>
<name>Nexus aliyunname>
<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>
mirrors>
<profiles>
<profile>
<id>jdk-1.8id>
<activation>
<activeByDefault>trueactiveByDefault>
<jdk>1.8jdk>
activation>
<properties>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<maven.compiler.compilerVersion>1.8maven.compiler.compilerVersion>
properties>
profile>
profiles>
入门案例需求:浏览网页时发送/hello请求,响应 Hello Spring Boot 2 !
导入父工程(固定写法),导入开发web场景的依赖。
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.3.4.RELEASEversion>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
@SpringBootApplication:向Spring表明这是一个SpringBoot应用,启动这个main方法即可启用SpringBoot应用并开启服务器,不用再自己手动配置Tomcat了。
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class,args);
}
}
@RestController:这是@Controller、@ResponseBody等注解的结合体,声明这是啥一个Controller类并返回值不再是个地址给地址解析器而是直接输出到页面上。具体可以观察其源码。
@RestController
public class HelloController {
@RequestMapping("hello")
public String handle01(){
return "Hello SpringBoot 2 !";
}
}
到此直接运行main方法即可开启服务器进行入门程序的测试了。
SpringBoot为我们准备了一个统一的配置文件application.properties,所有配置都可以在这里更改(tomcat、springmvc等),不更改的话都是用的SpringBoot的默认配置,在官方文档中可以查看到。
例如,我们可以修改tomcat服务器的端口号为8888。
server.port=8888
加入插件后,用maven-clean、maven-package把项目打成jar包。
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
jar包在target文件夹里可以找到,可以通过cmd直接在目标服务器执行(注意,要取消cmd的快速编辑模式)。
父项目做依赖管理:
导入的父项目。
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.3.4.RELEASEversion>
parent>
ctrl+左键 进入父项目的父项目。
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>2.3.4.RELEASEversion>
parent>
ctrl+左键 进入依赖管理。在此springboot几乎声明了所有开发中常用的依赖的版本号。
这是springboot的自动版本仲裁机制,因此我们引入依赖默认都可以不写版本,但引入非版本仲裁的jar仍需要写版本号。
若需要使用其他版本的jar包,我们也可以修改默认版本号。
<properties>
<mysql.version>5.1.43mysql.version>
properties>
我们见过很多 spring-boot-starter-* ,其中 * 表示的就是某种场景,比如batch、jdbc等。只要引入starter,这个场景的所有常规需要的依赖我们都自动引入。当我们用springboot进行web开发时引入的场景启动器如下:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
SpringBoot所有支持的官方场景:
https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter
我们也可以使用第三方制作的场景启动器,比如我们见到的 *-spring-boot-starter 的命名格式,就是第三方为我们提供的简化开发的场景启动器。
所有场景启动器最底层的依赖都是基于如下:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
<version>2.3.4.RELEASEversion>
<scope>compilescope>
dependency>
以上4、5点为自动配置的一些原理,现在来进一步介绍springboot的自动配置。
springboot为我们自动配好了tomcat。
自动为我们引入了tomcat的依赖,且自动配置好了tomcat。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-tomcatartifactId>
<version>2.3.4.RELEASEversion>
<scope>compilescope>
dependency>
springboot为我们自动配好了springmvc。
自动引入SpringMVC全套组件,且自动配好了springmvc的常用功能,如:DispatcherServlet、字符编码过滤器CharacterEncodingFilter、视图解析器ViewResolver、文件上传解析器MultipartResolver。
springboot为我们自动配好了一些web常用的功能。
springboot为我们自动解决了一些问题,如:字符编码问题
springboot也帮我们配置好了所有web开发的常见场景,如:文件上传
我们可以通过获取IoC容器来看看springboot为我们具体准备了哪些组件。
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
}
之前,我们需要手动进行xml配置指定需要扫描的包。而现在,主程序所在包及其下面的所有子包里面的组件都会被默认被springboot扫描进来,无需以前的扫描配置。
想要改变路径,可在**@SpringBootApplication**注解中加入属性scanBasePackages。
@SpringBootApplication(scanBasePackages="com.swz")
或者用老方法**@ComponentScan**来指定扫描路径。
@SpringBootApplication
等同于
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.swz.boot")
springboot的统一配置文件application.properties里的各种配置都拥有默认值,如:
我们也可以对默认值进行修改。
spring.servlet.multipart.max-file-size=10MB
默认配置最终都是映射到某个类上,如:MultipartProperties。我们自己配置文件的值最终也会被绑定到每个类上,这个类会在容器中被创建对象。
若我们的工程中有非常多的starter,引入了什么场景,那么这个的自动配置才会开启。Springboot所有的自动配置功能都在 spring-boot-autoconfigure这个包里。
例如,spring-boot-starter-web的父项目spring-boot-starter里就有一个spring-boot-autoconfigure包,里面都是用于自动配置的配置类(有许多报红的,是因为没有引入相关的场景,但由于springboot是按需加载的,只会使用那些我们引入且需要用到的配置类)。