springboot原理初识

1 pox.xml 及其相关依赖

springboot原理初识

 

 父依赖 spring-boot-starter-parent

spring-boot-starter-parent 父依赖 spring-boot-dependencies

springboot原理初识

 

 spring-boot-dependencies包含大量的jar包依赖

2.启动器 spring-boot-starter-xxx

springboot原理初识

 

 SpringBoot将所有的功能场景都抽取出来,做成一个个的starter (启动器),只需要在项目中引入这些starter即可,所有相关的依赖都会导入进来 , 我们要用什么功能就导入什么样的场景启动器即可 ;我们未来也可以自己自定义 starter;

3.主启动类

springboot原理初识

 

 只有SpringBootApplication注解 和run启动方法(本文章只涉及注解,run方法看下篇)

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

4.SpringBootApplication注解自动装配原理初探

SpringBootApplication.java中注解

springboot原理初识

 其中核心注解为SpringBootConfiguration和EnableAutoConfiguration

SpringBootConfiguration 表示SpringBoot的配置类

springboot原理初识

 

这里的 @Configuration,说明这是一个配置类 ,配置类就是对应Spring的xml 配置文件;

springboot原理初识

 

 到这里@Component注解就到头了,这就说明,启动类本身也是Spring中的一个组件而已,负责启动应用!

 

 @EnableAutoConfiguration 自动装配

springboot原理初识

 

 这里有一个@AutoConfigurationPackage 自动配置包 进入

springboot原理初识

 

 这里有@Import注解导入自动配置包的注册类

分类2.4版本之前:

@Import({AutoConfigurationImportSelector.class}) :给容器导入组件 ;

AutoConfigurationImportSelector :自动配置导入选择器,那么它会导入哪些组件的选择器呢?我们点击去这个类看源码:

1、这个类中有一个这样的方法getCandidateConfigurationshu获取候选配置

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {  
//这里的getSpringFactoriesLoaderFactoryClass()方法
//返回的就是我们最开始看的启动自动导入配置文件的注解类;
EnableAutoConfiguration
List<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原理初识

 

 在springboot的自动装配包下

部分内容如下

springboot原理初识

 

 

webmvcConfiguration
springboot原理初识

 

 可以看到这些一个个的都是JavaConfig配置类,而且都注入了一些Bean

总结:Springboot自动装配就是从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值

将这些值作为bean导入ioc容器,判断某些条件这些类就可以生效,自动装配完成。

 


 

 

上一篇:SpringFactoriesLoader,解析META-INF/spring.factories的工具


下一篇:flask-login 整合 pyjwt + json 简易flask框架