Spring Boot 自动装配流程
SuperMaskv 人气:1
# Spring Boot 自动装配流程
本文以 mybatis-spring-boot-starter 为例简单分析 Spring Boot 的自动装配流程。
## Spring Boot 发现自动配置类
这里说的自动配置类指的是在 `META-INF/spring.factories` 文件中声明的 `XXXAutoConfiguration` 类。
首先,我们从 `@SpringBootApplication` 注解的定义中,我们可以发现有一个叫做 `@EnableAutoConfiguration` 的注解,这也是 SpringBoot 实现自动装配最关键的注解。
```java
//@EnableAutoConfiguration 注解的定义
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class[] exclude() default {};
String[] excludeName() default {};
}
```
`@Target` `@Retention` `@Documented` `@Inherited` 都是 jdk 提供的注解,有兴趣可以去查查看,这里就不做分析了。这里主要分析 `@AutoConfigurationPackage` 和 `@Import({AutoConfigurationImportSelector.class})` 究竟起到什么作用。
```java
//@AutoConfigurationPackage 注解的定义
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
}
```
在 `@AutoConfigurationPackage` 注解的定义中,我们又发现一个 `@Import` 注解。`@Import` 注解是由 Spring 提供的,作用是将某个类实例化并加入到 Spring IoC 容器中。所以我们要想知道 `@Import({Registrar.class})` 究竟做了什么就需要了解 `Registrar` 这个类里包含了哪些方法。
```java
//Registrar 类的定义
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
Registrar() {
}
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName());
}
public Set
加载全部内容