前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot自动装配原理(简单易懂)

SpringBoot自动装配原理(简单易懂)

作者头像
全栈程序员站长
发布2022-11-16 18:32:00
3.9K0
发布2022-11-16 18:32:00
举报

1、什么是自动装配

自动装配就是把别人(官方)写好的config配置类加载到spring容器,然后根据这个配置类生成一些项目需要的bean对象。 (小声逼逼:就像我们自己在项目了写的config配置类一样的,只不过这个是别人写好的,你什么都不用管)

2、自动装配的开关在哪里

代码语言:javascript
复制
@SpringBootApplication
   |--@EnableAutoConfiguration
     |--@Import({ 
   AutoConfigurationImportSelector.class})

Jetbrains全家桶1年46,售后保障稳定

@SpringBootApplication注解里的@EnableAutoConfiguration@Import注解导入了一AutoConfigurationImportSelector.class类,这个类的selectImports方法会扫描我们类路径下的一个spring.factories文件(里面装的是很多官方写好的自动配置类的全限定名),然后返回这些类的名字。

  • selectImports方法如下:
代码语言:javascript
复制
public String[] selectImports(AnnotationMetadata annotationMetadata) { 
   
        if (!this.isEnabled(annotationMetadata)) { 
   
            return NO_IMPORTS;
        } else { 
   
            AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
            return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
        }
    }
  • spring.factories文件的位置如下:
在这里插入图片描述
在这里插入图片描述
  • spring.factories文件的内容如下:
在这里插入图片描述
在这里插入图片描述

3、自动装配开始(以tomcat为例)

前面的selectImports函数会拿到 spring.factories文件里的自动配置类,然后去解析这些配置类,这里以ServletWebServerFactoryAutoConfiguration为例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这个类上面有很多条件注解,大致就是说当你的应用是web应用,符合spring MVC那一套,像什么Servlet啊等等,这个配置类才生效。其中这个配置类又用@Import注解导入了几个类如下:

代码语言:javascript
复制
@Import({ 
   ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
 EmbeddedTomcat.class, 
 EmbeddedJetty.class, 
 EmbeddedUndertow.class})

这几个看名字就知道是什么,就是一些web容器嘛,Tomcat、Jetty、Undertow。其实EmbeddedTomcat.classEmbeddedJetty.classEmbeddedUndertow.classServletWebServerFactoryConfiguration里的三个静态内部类。 这里以EmbeddedTomcat.class这个内部类为例,代码如下:

代码语言:javascript
复制
 @ConditionalOnClass({ 
Servlet.class, Tomcat.class, UpgradeProtocol.class})
@ConditionalOnMissingBean(
value = { 
ServletWebServerFactory.class},
search = SearchStrategy.CURRENT
)
static class EmbeddedTomcat { 

EmbeddedTomcat() { 

}
@Bean
TomcatServletWebServerFactory tomcatServletWebServerFactory(ObjectProvider<TomcatConnectorCustomizer> connectorCustomizers, ObjectProvider<TomcatContextCustomizer> contextCustomizers, ObjectProvider<TomcatProtocolHandlerCustomizer<?>> protocolHandlerCustomizers) { 

TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.getTomcatConnectorCustomizers().addAll((Collection)connectorCustomizers.orderedStream().collect(Collectors.toList()));
factory.getTomcatContextCustomizers().addAll((Collection)contextCustomizers.orderedStream().collect(Collectors.toList()));
factory.getTomcatProtocolHandlerCustomizers().addAll((Collection)protocolHandlerCustomizers.orderedStream().collect(Collectors.toList()));
return factory;
}
}

注意:第一行的 @ConditionalOnClass({Servlet.class, Tomcat.class, UpgradeProtocol.class}),这个条件注解表示你的类路径下有tomcat的依赖,即导入了Tomcat的jar包才会生效,EmbeddedTomcat.classEmbeddedJetty.class也同理,但是只能有一个哈,导入了tomcat的jar包就不能导入其它的,不然会报错,当然了springboot默认tomcat,不需要我们导入。 这里会返回一个TomcatServletWebServerFactory 类,点进去后,其代码如下:

代码语言:javascript
复制
public class TomcatServletWebServerFactory 
extends AbstractServletWebServerFactory 
implements ConfigurableTomcatWebServerFactory, ResourceLoaderAware { 

其它代码不重要,哈哈。。。

这里继承了一个AbstractServletWebServerFactory 类, --------------AbstractServletWebServerFactory 类又继承了--------------AbstractConfigurableWebServerFactory, 好,点击AbstractConfigurableWebServerFactory进去就可以看到我们熟悉的8080端口号了,如下:

在这里插入图片描述
在这里插入图片描述

3、结束语

其实springboot的自动装配还是比较复杂的,大概可以概括为:在启动类的run方法传入启动类的class(方便后面获取其注解信息)。 执行run方法,创建SpringApplication对象,并用LoadSpringFactories()方法将/META-INF/spring.factories文件里的k-v读入缓存(方便后面加载时使用)。 然后继续run方法,在某处会获取传入的启动类的class,并解析上面的注解,当解析到@Import({AutoConfigurationImportSelector.class})时会将AutoConfigurationImportSelector加载进方法区,通过反射创建对象,调用其某一个方法,从缓存读取前面存储的k-v,并经过一系列的过滤、去重等,最后将需要的配置类加载,生成BD对象,创建Bean对象,放入spring容器。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/234599.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022年11月2日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、什么是自动装配
  • 2、自动装配的开关在哪里
  • 3、自动装配开始(以tomcat为例)
  • 3、结束语
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档