# Springboot 自动装配
# 核心注解 @SpringBootApplication
1 |
|
@SpringBootConfiguration
1 | @Target(ElementType.TYPE) |
@SpringBootApplication 组合了很多注解:
- @EnableAutoConfiguration :启用 SpringBoot 的自动配置
- @AutoConfigurationPackage:主配置类(@SpringBootApplication 标注的类)的所在包以及下面所有子包里面的所有组件扫描到 Spring 容器。
@Import(AutoConfigurationImportSelector.class):自动装配核心功能的实现
- @ComponentScan:扫描 @Component(@Controller、@Service、@Repository 都包含此注解)并注入容器
- @SpringConfiguration
- Configuration:允许在 ApplicationContext 中注册额外的 Bean 或导入其他配置类
- Indexed: 项目编译打包时,会在自动生成 META-INF/spring.components 文件
# @EnableAutoConfiguration
@EnableAutoConfiguration 注解中导入了 AutoConfigurationImportSelector
类。
AutoConfigurationImportSelector
类实现了 ImportSelector
接口,也就实现了这个接口中的 selectImports
方法,该方法主要用于获取所有符合条件的类的全限定类名,这些类需要被加载到 IOC 容器中。
1 |
|
其中 getAutoConfigurationEntry(annotationMetadata)
1 | protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) { |
最后方法返回了一个 AutoConfigurationEntry
,它是 AutoConfigurationImportSelector 的内部类
1 | protected static class AutoConfigurationEntry { |
最后 selectImports(AnnotationMetadata annotationMetadata)
方法返回一个配置类的全限定名数组。
# 自定义 Starter
代码参考:尚硅谷 springboot2 课程
准备一个空工程
新建一个 Maven 模块,命名为
XXX-spring-boot-start
充当启动器pom 文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<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>
<groupId>per.windlinxy</groupId>
<artifactId>windlinxy-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>per.windlnxy</groupId>
<artifactId>windlinxy-spring-boot-starter-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>再使用 Spring Initializr 创建一个模块,命名为
XXX-spring-boot-start-autoconfigure
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<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.7.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>per.windlnxy</groupId>
<artifactId>windlinxy-spring-boot-starter-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>windlinxy-spring-boot-starter-autoconfigure</name>
<description>windlinxy-spring-boot-starter-autoconfigure</description>
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>在
XXX-spring-boot-start-autoconfigure
模块编写代码使用 maven 进行 install 将两个模块注入到本地 maven 仓库
1
2
3
4
5
6
7per
├─windlinxy
│ └─windlinxy-spring-boot-starter
│ └─1.0-SNAPSHOT
└─windlnxy
└─windlinxy-spring-boot-starter-autoconfigure
└─0.0.1-SNAPSHOT在另外的项目进行注册
1
2
3
4
5<dependency>
<groupId>per.windlinxy</groupId>
<artifactId>windlinxy-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>使用
配置文件:
1
2
3hello:
prefix: 11
suffix: 666Controller:
1
2
3
4
5
6
7
8
9
10
public class HelloController {
private HelloService helloService;
public String sayHello() {
return helloService.sayHello("张三");
}
}
HelloServiceAutoConfiguration
自动配置类
1 |
|
HelloProperties
1 |
|
HelloService
1 | // 默认不放入容器 |
resources/META-INF/spring.factiories 文件
1 | # Auto Configure |