SpringBootApplication包含下面几个注解:
- SpringBootConfiguration:使用这个注解表明该类是一个配置类,可以在这个类中写一些配置文件
- EnableAutoConfiguration:开启自动装配上下文
- AutoConfigurationImportSelector:导入自动配置类,根据
FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories找到AutoConfiguration类的全路径
- AutoConfigurationImportSelector:导入自动配置类,根据
- ComponentScan指定扫描@Component的位置,默认是从当前springbootapplication类同级包下开始扫描
重要代码:
protected List<AutoConfigurationImportListener> getAutoConfigurationImportListeners() {
return SpringFactoriesLoader.loadFactories(AutoConfigurationImportListener.class, this.beanClassLoader);
}
private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
MultiValueMap<String, String> result = cache.get(classLoader);
if (result != null) {
return result;
}
try {
Enumeration<URL> urls = (classLoader != null ?
classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
result = new LinkedMultiValueMap<>();
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
UrlResource resource = new UrlResource(url);
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
for (Map.Entry<?, ?> entry : properties.entrySet()) {
String factoryTypeName = ((String) entry.getKey()).trim();
for (String factoryImplementationName : StringUtils.commaDelimitedListToStringArray((String) entry.getValue())) {
result.add(factoryTypeName, factoryImplementationName.trim());
}
}
}
cache.put(classLoader, result);
return result;
}
catch (IOException ex) {
throw new IllegalArgumentException("Unable to load factories from location [" +
FACTORIES_RESOURCE_LOCATION + "]", ex);
}
}
@ComponentScan扫描的组件包括@Component、@Controller、@Service、@Repository等注解标注的类
总结:
@SpringBootApplication这个注解作用是把FACTORIES_RESOURCE_LOCATION中指定的AutoConfiguration进行装载,以及将自定义的组件类也装载进来