springboot原理初识
作者:互联网
1 pox.xml 及其相关依赖
父依赖 spring-boot-starter-parent
spring-boot-starter-parent 父依赖 spring-boot-dependencies
spring-boot-dependencies包含大量的jar包依赖
2.启动器 spring-boot-starter-xxx
SpringBoot将所有的功能场景都抽取出来,做成一个个的starter (启动器),只需要在项目中引入这些starter即可,所有相关的依赖都会导入进来 , 我们要用什么功能就导入什么样的场景启动器即可 ;我们未来也可以自己自定义 starter;
3.主启动类
只有SpringBootApplication注解 和run启动方法(本文章只涉及注解,run方法看下篇)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4.SpringBootApplication注解自动装配原理初探
SpringBootApplication.java中注解
其中核心注解为SpringBootConfiguration和EnableAutoConfiguration
SpringBootConfiguration 表示SpringBoot的配置类
这里的 @Configuration,说明这是一个配置类 ,配置类就是对应Spring的xml 配置文件;
到这里@Component注解就到头了,这就说明,启动类本身也是Spring中的一个组件而已,负责启动应用!
@EnableAutoConfiguration 自动装配
这里有一个@AutoConfigurationPackage 自动配置包 进入
这里有@Import注解导入自动配置包的注册类
分类2.4版本之前:
@Import({AutoConfigurationImportSelector.class}) :给容器导入组件 ;
AutoConfigurationImportSelector :自动配置导入选择器,那么它会导入哪些组件的选择器呢?我们点击去这个类看源码:
1、这个类中有一个这样的方法getCandidateConfigurationshu获取候选配置
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
//这里的getSpringFactoriesLoaderFactoryClass()方法//返回的就是我们最开始看的启动自动导入配置文件的注解类;
EnableAutoConfigurationList<String> configurations = SpringFactoriesLoader.loadFactoryNames
(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
2、这个方法又调用了 SpringFactoriesLoader 类的静态方法!我们进入SpringFactoriesLoader类loadFactoryNames() 方法
public static List<String> loadFactoryNames(Class<?> factoryClass, @Nullable ClassLoader classLoader)
{String factoryClassName = factoryClass.getName();
//这里它又调用了 loadSpringFactories 方法
return (List)loadSpringFactories(classLoader).getOrDefault(factoryClassName, Collections.emptyList());}
3、我们继续点击查看 loadSpringFactories 方法private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
//获得classLoader , 我们返回可以看到这里得到的就是EnableAutoConfiguration标注的类本身
MultiValueMap<String, String> result = (MultiValueMap)cache.get(classLoader);
if (result != null) {
return result;
}
else {
try {
//去获取一个资源 "META-INF/spring.factories"
Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
LinkedMultiValueMap result = new LinkedMultiValueMap();
//将读取到的资源遍历,封装成为一个Properties
while(urls.hasMoreElements()) {
URL url = (URL)urls.nextElement();
UrlResource resource = new UrlResource(url);
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
Iterator var6 = properties.entrySet().iterator();
while(var6.hasNext()) {
Entry<?, ?> entry = (Entry)var6.next();
String factoryClassName = ((String)entry.getKey()).trim();
String[] var9 = StringUtils.commaDelimitedListToStringArray((String)entry.getValue());
int var10 = var9.length;
for(int var11 = 0; var11 < var10; ++var11) {String factoryName = var9[var11];
result.add(factoryClassName, factoryName.trim());
}
}
}
cache.put(classLoader, result);
return result;
}
catch (IOException var13) {
throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var13);
}
4.spring.factories
在springboot的自动装配包下
部分内容如下
webmvcConfiguration
可以看到这些一个个的都是JavaConfig配置类,而且都注入了一些Bean
总结:Springboot自动装配就是从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
将这些值作为bean导入ioc容器,判断某些条件这些类就可以生效,自动装配完成。
标签:springboot,spring,classLoader,导入,初识,result,注解,原理,factories 来源: https://www.cnblogs.com/ywy1/p/14945617.html