SpringBoot
一、什么是SpringBoot?
二、SpringBoot自动装配
这是一个启动类:
我们需要了解的就是@SpringBootApplication
点进去,其重点在于这几个注解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
1.@SpringBootConfiguration
没有什么特殊的,就表明这是一个配置类
2.@EnableAutoConfiguration----重点
顾名思义,自动装配
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
1.@AutoConfigurationPackage
将使用了@AutoConfigurationPackage类所在的包作为自动装配的包,比如我们的启动类,默认就是加载启动类所在包及子包的bean
它导入了一个Register类,我们看看这个类是干嘛的:
其核心就是这个方法:将自动装配包中的bean注册到IOC容器中
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
}
2.@Import({AutoConfigurationImportSelector.class})
AutoConfigurationImportSelector.class?这个类是干嘛的?点进去看看
核心代码:
protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
} else {
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
configurations = this.removeDuplicates(configurations);
Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = this.getConfigurationClassFilter().filter(configurations);
this.fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
}
}
打上断点:
如下图,这行代码会去:META-INF/spring.factories目录下找spring.factories中配置了哪些自动装配的类
它会在所有的依赖包中找META-INF/spring.factories,
打开spring.factories看看:(仅部分截图)
然后:
自动装配过程结束
这是指定不自动装配的自动装配类
如果你想排除自己写的bean,就