<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>top.wu</groupId>
<artifactId>springbootdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springbootdemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- Spring Boot场景启动器,帮我们导入了web模块正常运行所依赖的组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- 可以将应用打包成一个可执行的jar包 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Spring Boot将所有的功能场景都抽取出来,做成一个个starters(启动器),只需要在项目里面引入这些starters相关场景的所有依赖都会导入进来。需要什么功能就导入什么场景启动器
<!-- spring-boot-starter-parent的父项目 -->
<!-- Spring Boot的仲裁中心,导入依赖默认不需要写版本,没有在dependencies中管理的就需要写 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.6.RELEASE</version>
</parent>
@SpringBootApplication //来标注一个主程序类,说明这是一个Spring Boot应用
public class SpringbootdemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootdemoApplication.class, args);
}
}
@SpringBootApplication
:注解标注在某个类上,说明该类是 SpringBoot 的主配置类,SpringBoot 就应该运行这个类的 main 方法来启动项目
@SpringBootConfiguration
:标注某个类是配置类
@Configuration
:配置类上标注这个注解 --- 与配置文件功能相同,配置类也是一个组件@EnableAutoConfiguration
:开启自动配置功能 --- 以前需要配置的东西,现在都不需要配置
@AutoConfigurationPackage
:自动配置包,将主配置类(@SpringBootApplication
标注的类)的所在包及下面所有子包里面的所有组件扫描到 Spring 容器中
@Import({Registrar.class})
:Spring 的底层注解,给容器中导入一个组件;导入的组件有 Registrar.class
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { //meatdata表示元数据,包含扫描到的组件的信息
AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName());
}
@Import({AutoConfigurationImportSelector.class})
:导入哪些组件的选择器 --- 将所有需要导入的组件以全类目的方式返回;这些组件就会被添加到容器中,会给容器中导入非常多的自动配置类(XXXAutoConfiguration);就是给这些容器中导入这个场景所需要的所有组件,并配置好这些组件,免去了手动编写配置注入功能组件的工作
//部分源码
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;
}
Spring Boot启动时从类路径下的 META-INF/spring.factories 中获得 EnableAutoConfiguration 指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行配置工作
J2EE 的整体整合解决方案和自动配置都在:spring-boot-autoconfigure-2.2.1.RELEASE.jar 中