启动SpringBoot主要注解是@SpringBootApplication,代码如下
@SpringBootApplication
public class SpringBootDemoApplication{
public static void main(String[] args){
SpringApplication.run(SpringBootDemoApplication.class,args);
}
}
点击@SpringBootApplication进入源码查看一下,源码如下:
@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 {
//代码省略...
}
大家可以看看上面的众多注解里面,哪一个是自动装配嘞?没错,是@EnableAutoConfiguration,这是开启自动装配
这里科普一下:@Enable注解,其实大家在平常开发的时候,可能会遇到很多@Enablexxxx的,其实spring3.1版本之后就已经存在这个注解了,他主要的作用就是把相关组件的Bean装配到IOC容器里,降低了使用难度
我们找到了自动装配的注解,那我继续进入源码看一下:
@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 {};
}
这里我们主要看@Import和@AutoConfigurationPackage(作用是把使用这个注解的类所在的包及其子包下所有组件扫描到Spring的IOC容器汇总)注解,这里的@Import导入了一个选择器类,我们查看一下这个选择器的源码:
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
//代码省略...
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return NO_IMPORTS;
} else {
AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
}
//代码省略...
}
这个类实现了ImportSelector接口,重写了selectImports方法,看一下上面的else中的代码,会收集到需要装配的数据,批量配置,然后通过Spring提供的SpringFactoriesLoader机制,扫描其classpath路径下的META-INF/spirng.factories,读取需要实现自动装配的配置类,我们看一下这个spring.factories配置文件的内容:
//随便拉了一个
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.enniu.cloud.base.autoconfigure.config.EnniuConfigBootstrapConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.enniu.cloud.base.autoconfigure.config.EnniuConfigAutoConfiguration
他是一个key/value的形式,获取需要装配的key,把对应的class路径装配到IOC容器中,然后还有一个@ConditionalOnClass注解,他是条件控制注解,为了控制组件满足条件之后再注入IOC容器中,然后PringFactoriesLoader.loadFactoryNames会根据key得到对应的value值,通过条件筛选的方式,把不符合条件的配置类移除、去重等操作,最终完成自动装配
demo样例链接: https://gitee.com/IT_CB/conditional-autoconfighttps://gitee.com/IT_CB/conditional-autoconfig