目录
SpringBoot介绍_Spring缺点分析
SpringBoot介绍_什么是SpringBoot
SpringBoot介绍_SpringBoot核心功能
SpringBoot入门_通过官网搭建项目
SpringBoot入门_通过IDEA脚手架搭建项目
SpringBoot入门_SpringBoot项目结构
SpringBoot入门_通过Maven搭建项目
SpringBoot入门_编写Java代码
SpringBoot原理分析_起步依赖
查看spring-boot-starter-parent起步依赖
查看spring-boot-starter-web起步依赖
SpringBoot原理分析_自动配置
Spring是一个非常优秀的轻量级框架,以IOC(控制反转)和AOP(面向切面)为思想内核,极大简化了JAVA企业级项目的开发。虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。使用Spring进行项目开发需要在配置文件中写很多代码,所有这些配置都代表了开发时的损耗。
除此之外,Spring项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。比如Spring5.0以上只能使用Junit4.12以上的版本。
总结
Spring的缺点:
1.配置过于繁琐。
2.引入的依赖过多,版本控制复杂。
SpringBoot对Spring的缺点进行改善和优化,基于约定大于配置的思想,简化了Spring的开发,所谓简化是指简化了Spring中大量的配置文件和繁琐的依赖引入。所以SpringBoot是一个服务于框架的框架,它不是对Spring功能的增强,而是提供了一种快速使用Spring框架的方式。
SpringBoot的优点:
配置简单
1.依赖引入简单
2.提供了一些大型项目的非功能特性,如嵌入式服务器,安全指标,健康监测等。
自动配置
SpringBoot项目自动提供最优配置,同时可以修改默认值满足特定的要求。
起步依赖
SpringBoot的依赖是基于功能的,而不是普通项目的依赖是基于JAR包的。SpringBoot将完成一个功能所需要的所有坐标打包到一起,并完成了版本适配,我们在使用某功能时只需要引入一个依赖即可。
接下来我们搭建一个SpringBoot项目,并引入SpringMVC的功能,
首先我们可以通过官网搭建项目:
1.访问start.spring.io
2.生成SpringBoot项目
SpringBoot版本说明:
SNAPSHOT:快照版,表示开发版本,随时可能修改;
M1(Mn):M1是milestone的缩写,也就是里程碑版本;RC1(RCn):RC1是release candidates的缩写,也就是发布预览版;
Release:正式版,也可能没有任何后缀也表示正式版
SpringBoot打包类型说明:
使用SpringMVC开发的是一个web项目,但由于在SpringBoot中直接嵌入了Tomcat等
Web容器,所以在使用SpringBoot做Web开发时不需要部署War文件,只需要打成Jar
包即可。
我们也可以在IDEA中利用脚手架工具搭建项目:
在IDEA中新建项目,项目类型为Spring Initializr,选择JDK版本
和搭建网站后点击下一步。
脚手架工具也会访问SpringBoot官网进行项目搭建,但SpringBoot官网有时访问速度较慢,我们也可以选择国内的镜像网站https://start.aliyun.com/搭建项目,阿里的脚手架镜像SpringBoot版本有些滞后。
选择项目参数后,点击下一步
选择SpringBoot版本和需要的起步依赖,点击下一步。
接下来我们分析SpringBoot的项目结构:
POM文件
SpringBoot项目必须继承spring-boot-starter-parent,即所有的SpringBoot项目都是spring-boot-starter-parent的子项目。
spring-boot-starter-parent中定义了常用配置、依赖、插件等信息,供SpringBoot项目继承使用。
org.springframework.boot
spring-boot-starter-parent
2.7.0-M1
SpringBoot项目中可以定义起步依赖,起步依赖不是以jar包为单位,而是以功能为单位
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
spring-boot-maven-plugin插件是将项目打包成jar包的插件。
该插件打包后的SpringBoot项目无需依赖web容器,可以直接使用JDK运行
org.springframework.boot
spring-boot-maven-plugin
启动类
启动类的作用是启动SpringBoot项目,运行启动类的main方法即可
启动SpringBoot项目。
@SpringBootApplication
public class Springbootdemo2Application {
public static void main(String[] args) {
SpringApplication.run(Springbootdemo2Application.class, args);
}
}
配置文件
由于SpringBoot极大简化了Spring配置,所以只有一个application.properties配置文件,且Spring的自动配置功能使得大部分的配置都有默认配置,该文件的功能是覆盖默认配置信息,该文件不写任何信息都可以启动项目。
启动后默认端口号为8080,我们可以覆盖该配置:
server.port=8888
了解了SpringBoot结构后,我们也可以使用Maven手动搭建
SpringBoot项目:使用Maven创建普通JAVA项目
在pom中添加项目的父工程、起步依赖、插件
org.springframework.boot
spring-boot-starter-parent
2.7.0-M1
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-maven-plugin
编写启动类
@SpringBootApplication
public class SpringBootApp {
public static void main(String[] args)
{
SpringApplication.run(SpringBootApp.class, args);
}
}
编写配置文件application.properties
#日志格式
logging.pattern.console=%d{MM/dd
HH:mm:ss.SSS} %clr(%-5level)
---[%-15thread] %cyan(%-50logger{50}):%msg%n
#端口号
server.port=8888
运行启动类主方法,启动项目
之前搭建的SpringBoot项目已经都整合了SpringMVC,我们编写一
个控制器进行测试:
@Controller
public class MyController {
@RequestMapping("/hello")
@ResponseBody
public String hello(){
System.out.println("hellospringboot!");
return "hello springboot!";
}
}
启动类在启动时会做注解扫描(@Controller、@Service、@Repository......),扫描位置为同包或者子包下的注解,所以我们要在启动类同级或同级包下编写代码。
启动项目,访问http://localhost:8888/hello
按住 Ctrl 点击 pom.xml 中的 spring-boot-starter-parent ,跳转到了 spring-boot-
starter-parent 的 pom.xml ,发现 spring-boot-starter-parent 的父工程是 spring-boot-
dependencies 。
进入 spring-boot-dependencies 的 pom.xml 可以看到,一部分坐标的版本、
依赖管理、插件管理已经定义好,所以SpringBoot工程继承
spring-boot-starter-parent 后已经具备版本锁定等配置了。所以起步依赖
的作用就是进行依赖的传递。
按住 Ctrl 点击 pom.xml 中的 spring-boot-starter-web ,跳转到了 spring-boot-starter-
web 的 pom.xml ,从 spring-boot-starter-web 的 pom.xml 中我们可以发现, spring-
boot-starter-web 就是将web开发要使用的 spring-web 、 spring-webmvc 等坐标进
行了打包,这样我们的工程只要引入 spring-boot-starter-web 起步依赖的坐
标就可以进行web开发了,同样体现了依赖传递的作用。
查看注解 @SpringBootApplication 的源码
@SpringBootConfifiguration:等同与@Confifiguration, 既标注该类是Spring的一个配置类
@EnableAutoConfifiguration:SpringBoot自动配置功能 开启
查看注解 @EnableAutoConfifiguration 的源码
查看注解 @EnableAutoConfifiguration 的源码
@Import(AutoConfifigurationImportSelector.class) 导入了 AutoConfifigurationImportSelector 类
查看AutoConfifigurationImportSelector源码
查看AutoConfifigurationImportSelector源码
SpringFactoriesLoader.loadFactoryNames 方法的作用就是从 META-INF/spring.factories 文件中读取指定类对应的类名称列表
点开 spring-boot-autoconfigure 的 spring.factories 文件
有关配置类的信息如下:
上面配置文件存在大量的以 Configuration 为结尾的类名称,这些类 就是存有自动配置信息的类,而 SpringApplication 在获取这些类名后 再加载。
我们 ServletWebServerFactoryAutoConfifiguration 为例来分析源码:
@EnableConfifigurationProperties(ServerProperties.class) 代表加载 ServerProperties 服务器配置属性类。
进入 ServerProperties 类源码如下:
prefifix = "server" 表示SpringBoot配置文件中的前缀,SpringBoot会 将配置文件中以server开始的属性映射到该类的字段中。所以配 置网络端口的方式为 server.port
如果我们没有在配置文件中配置默认端口,SpringBoot就会读 取默认配置,而默认配置存放在 META-INF/spring-configuration-metadata.json 中,打开 spring-boot-autoconfigure 的 spring.factories 文件
该文件中保存的就是所有默认配置信息。