Springboot 自动配置原理
SpringBoot 的核心注解 @SpringBootApplication 对三个注解进行了封装:
@SpringBootConfiguration : 该注解与 @Configuration 注解作用相同,用来声明当前也是一个配置类。
@EnableAutoConfiguration : 启用 SpringBoot 的自动配置机制。
@ComponentScan :扫描被 @Component (@Service, @Controller) 注解的 bean,注解默认会扫描启动类所在的包下所有的类 ,可以自定义不扫描某些 bean。
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited <1.>@SpringBootConfiguration <2.>@ComponentScan <3.>@EnableAutoConfiguration public @interface SpringBootApplication { } @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration //实际上它也是一个配置类 public @interface SpringBootConfiguration { }
@EnableAutoConfiguration 是实现自动化配置的核心注解!
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage //作用:将main包下的所有组件注册到容器中 @Import({AutoConfigurationImportSelector.class}) //加载自动装配类 xxxAutoconfiguration public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; Class<?>[] exclude() default {}; String[] excludeName() default {}; }
@EnableAutoConfiguration 注解通过@Import注解导入对应的配置选择器。
AutoConfigurationImportSelector 类实现了 ImportSelector 接口,也就实现了这个接口中的 selectImports 方法,该方法主要用于获取所有符合条件的类的全限定类名,这些类需要被加载到 IoC 容器中(读取了该项目和该项目引用的 Jar 包的的classpath路径下META-INF/spring.factories 文件中的所配置的类的全类名)。
在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。条件判断会有像@ConditionalOnClass这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器中使用。