2.Spring Boot 入门程序
- 由于SpringBoot是一个约定大于配置的框架,所以需要我们做的事情很少,基本都是springBoot自动装配了
第一步:创建一个SpringBoot项目
第二步:编写controller接口进行测试
- 这里需要注意的就是自己创建的包名要与SpringBoot的主启动类在同一级目录下
package com.xuan.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* xuan
* 2020/7/22
* 1870136088@qq.com
**/
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello springboot";
}
}
第三步:启动Springboot01HelloworldApplication,访问页面
- 访问 localhost:8080/hello 页面出现 hello springboot 就算第一个springBoot项目测试成功
2.1 入门程序深入分析
为什么我们只是做了极其简单的配置,就能做到spring复杂配置后的效果呢?
2.1.1 先从配置文件进行分析
- 先从配置文件来分析
- spring-boot-starter-parent这是springBoot场景启动器的父项目(父依赖)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
- Ctrl+鼠标左键跟进去 能够看到SpringBoot的依赖集合,再点进去
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.1.RELEASE</version>
</parent>
- properties标签处能够看到SpringBoot为我们导入了很多可能用到的依赖(下面就分享一些常用的)
<properties>
<activemq.version>5.15.12</activemq.version>
<jedis.version>3.3.0</jedis.version>
<junit.version>4.13</junit.version>
<log4j2.version>2.13.3</log4j2.version>
<aspectj.version>1.9.5</aspectj.version>
<assertj.version>3.16.1</assertj.version>
<logback.version>1.2.3</logback.version>
<lombok.version>1.18.12</lombok.version>
<spring-security.version>5.3.3.RELEASE</spring-security.version>
<mysql.version>8.0.20</mysql.version>
<jstl.version>1.2</jstl.version>
............
</properties>properties>
- 再来看看我们勾选web依赖帮我们做了什么
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 跟进进去spring-boot-starter-web
- json场景启动器 记不记得我们在ssm中使用json需要引入jackson-databind依赖,以及配置一些aop:annotation-driven标签中配置json乱码问题解决配置,这些springBoot的json场景启动器帮我们做了
- tomcat场景启动器:SpringBoot是内嵌(内置)了tomcat的,所以我们并没有配置tomcat就能运行了,tomcat默认端口是8080
- spring-web,spring-webmvc依赖:这相当于帮我们引入了所有关于spring的组件配置(spring7大组件都包含了)这里面其实还帮我们配置了spring的核心配置文件applicationContext.xml中的视图解析器,处理器映射器,处理器适配器等等以及web.xml 我们的DispatchServlet、CharacterEncodingFilter都不需要配置了
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.3.1.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
<version>2.3.1.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.3.1.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<scope>compile</scope>
</dependency>
</dependencies>
2.1.2.从主启动类进行分析
- SpringBoot自动配置原理无非就是在启动的时候去读取"META-INF/spring.factories"这个文件的自动配置
- 那如何读取呢?
- 跟进@SpringBootApplication第一个关键注解就是**@SpringBootConfiguration**跟进就只能发现他是一个被加入到SpringIOC容器的一个组件
- 另一个关键注解是**@EnableAutoConfiguration跟进关键就是AutoConfigurationImportSelector**这个类
AutoConfigurationImportSelector这个类下的selectImports这个方法中调用了getAutoConfigurationEntry方法这个方法里面就主要是读取配置文件里面有这样一段List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);于是我们跟进getCandidateConfigurations这个方法这个方法有一段message会说找META-INF/spring.factories下资源,但是他下面的loadFactoryNames方法才是关键 里面直接加载资源classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
-
基于以上我们就能找到META-INF/spring.factories通过在启动时扫描这个文件内容看哪些已经有添加进pom.xml从而实现自动装配
-
为什么spring.factories启动加载全部自动配置类还是有一些没有生效,这个的关键就是**@ConditionOnXXX**注解(是需要条件的)
package com.xuan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Springboot01HelloworldApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot01HelloworldApplication.class, args);
}
}
总结:SpringBoot在启动时会扫描自动配置包下的META-INF/spring.factories目录,这个目录已经包含了几乎所有的自动配置类全限定类名,SpringBoot会根据导入的场景启动器将特定的类扫描到并添加到SpringIOC容器中而这些AotoConfiguration会有很多个@Bean组件都会根据条件注入到IOC容器中。
run方法启动原理
- 第一步:判断是普通项目还是web项目
- 第二步:推断当前的主类(main)
- 第三步:run方法中有监听器,是全局的能够获取上下文内容 监听bean的生命周期
2.2 入门程序结构目录分析
resources类路径下的资源文件夹
- static目录:是放静态资源的 比如css js plugins pages
- templates目录:是放置模板引擎的(springboot默认是打jart包的 默认支持嵌入式tomcat) 这个放不了jsp 所以可以添加的的jsp模板为(freemaker,thymeleaf)
- application.propertise目录:springBoot的配置文件 可以修改默认配置也可以写成application.yml(yaml的格式看起来更加舒服,层次清晰)
java类路径下的资源文件以及类
- 标有@SpringBootApplication的主启动类是SpringBoot程序的入口
- 此外还可以在同级目录下创建我们开发所需的包及类,例如pojo、service、controller、utils、config等等
2.3 将项目打成jar包外部运行
第一步:我们一开始创建项目的时候就是选择了打jar包的方式对应配置如下
- pom.xml中打jar包代码
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
第二步:将项目打成jar包
- 找到右边Maven 在生命周期中选择package打包方式,双击运行
第三步:BUILD SUCCESS后在target找到我们打包的项目,复制
第四步:复制完随便找个文件夹扔进去(当然你也可以找到你项目对应target目录下的jar包,我这里就纯粹方便测试而已) cmd 进入命令行模式 实行java -jar 加上项目名
- 于是项目就启动了,你可以在页面进行测试 还是能访问到controller配置的输出结果的
基于以上我们将项目打成jar包测试就成功了!