Spring Boot的自动装配的结构图:
结构图入口点:SpringBoot的引导类有如下内容:
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class,args);
}
}
@SpringBootApplication注解:
@SpringBootApplication是一个组合注解,主要是以下三个注解:
@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
查看源码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
...
}
@SpringBootConfiguration注解:
查看源码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
看源码发现有一个@Configuration注解,这个注解是用来标识某一个类为Spring的
一个配置类,@SpringBootConfiguration注解和@Configuration注解的作用是一样的,但是Spring Boot更推荐@SpringBootConfiguration注解。
@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 {};
}
@EnableAutoConfifiguration注解也是组合注解,主要包含@AutoConfigurationPackage和
@Import。
@AutoConfigurationPackage注解:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
}
该注解通过@Import引入了一个Registrar.class类,Registrar类主要是加载@SpringBootApplication注解所
在类的包结构,并进行存储,为后期Spring Boot加载资源提供一个扫描的包路径。
@Import(AutoConfigurationImportSelector.class)
image.png上述@Import注解引入了一个类AutoConfigurationImportSelector.class,读取该类的源代码会发现,SpringBoot启动所在的装配类都在该注解类所在项目的META-INF/spring.factories文件中读取
image.pngSpring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作。以前我们需要自己配置的东西,自动配置类都帮我们完成了。
image.png
网友评论