@SpringBootApplication作为我们springboot的入口注解,究竟有什么用处呢?
都有什么呢?
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(xxx)
内部声明了另外一个注解
@Configuration
这个注解就表明了我们是一个配置类
这个注解大家都很熟悉了, 这会自动的扫描我们的组件,
和自动装配功能, 我们可以通过backPackage属性来显示的写出我们要扫描的包,默认的情况下== 就是我们的注解这个当前入口的包下,其他处是不管用的==
主要又是由其他两个注解组成
@AutoConfigurationPackage
注:这个注解主要是寻找到我们当前的配置类的包下,进行注册
@Import(AutoConfigurationImportSelector.class)
注:这个注解导入我们其他文件的一些配置,可以进行注册,但这个类的作用主要就是导入相关依赖了,
4.1@AutoConfigurationPackage代码实现:
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
//这个方法就能注册我们需要注册的一些配置信息了
register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
}
@Override
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new PackageImports(metadata));
}
}
4.2 AutoConfigurationImportSelector.class作用
自动导入一些我们需要的依赖,主要是在我们导入的包下的
META-INF/spring.factories下
源码:
private static Map<String, List<String>> loadSpringFactories(ClassLoader classLoader) {
Map<String, List<String>> result = cache.get(classLoader);
if (result != null) {
return result;
}
result = new HashMap<>();
try {
// public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
//
Enumeration<URL> urls = classLoader.getResources(FACTORIES_RESOURCE_LOCATION);
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();
String[] factoryImplementationNames =
StringUtils.commaDelimitedListToStringArray((String) entry.getValue());
for (String factoryImplementationName : factoryImplementationNames) {
result.computeIfAbsent(factoryTypeName, key -> new ArrayList<>())
.add(factoryImplementationName.trim());
}
}
}
// Replace all lists with unmodifiable lists containing unique elements
result.replaceAll((factoryType, implementations) -> implementations.stream().distinct()
.collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList)));
cache.put(classLoader, result);
}
catch (IOException ex) {
throw new IllegalArgumentException("Unable to load factories from location [" +
FACTORIES_RESOURCE_LOCATION + "]", ex);
}
return result;
}
注:这里面,虽然基本上涵盖了所有依赖,但实际是不会导入这么多依赖的.
底层都会使用==@Conditionalxxx==注解:来限制我们的直接进行导入,进行条件限制