SpringBoot_01@SpringBootApplication注解详解

@SpringBootApplication作为我们springboot的入口注解,究竟有什么用处呢?

1.首先,我们的这个注解主要是使用三个注解来构建成的.

都有什么呢?

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(xxx)

2. springBootConfiguration的作用

内部声明了另外一个注解
@Configuration
这个注解就表明了我们是一个配置类

3.ComponentScan

这个注解大家都很熟悉了, 这会自动的扫描我们的组件,
和自动装配功能, 我们可以通过backPackage属性来显示的写出我们要扫描的包,默认的情况下== 就是我们的注解这个当前入口的包下,其他处是不管用的==

4.@EnableAutoConfiguration 作用

主要又是由其他两个注解组成
@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;
	}

主要导入的是我们下面这个包下的:
SpringBoot_01@SpringBootApplication注解详解_第1张图片

注:这里面,虽然基本上涵盖了所有依赖,但实际是不会导入这么多依赖的.

底层都会使用==@Conditionalxxx==注解:来限制我们的直接进行导入,进行条件限制

你可能感兴趣的:(SpringBoot,spring,boot)