springboot是如何自动装配的
简述:springboot启动类详解
文章插图
接下来都是围绕着这个启动类进行介绍
一.点进去run方法 , 可以看到
文章插图
它可以去跑spring的一个实例 , 传参方式 , 任意一个类型的类和一个String数组,它会使用默认的配置 , 比如@SpringBootApplication,它会运行一个上下文对象
1.@SpringBootApplication的应用
点进去看下
文章插图
①:@SpringBootConfiguration
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Configurationpublic @interface SpringBootConfiguration {@AliasFor(annotation = Configuration.class)boolean proxyBeanMethods() default true;}
它的主要配置是@Configuration , 它是一个容器 , 相当于我们写spring中的xml的一些配置 , 如beans,包含了许多bean,是一个IOC容器
②:@EnableAutoConfiguration
它是用于开启自动装配的 , 点进去看下
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage@Import({AutoConfigurationImportSelector.class})public @interface EnableAutoConfiguration {String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";Class>[] exclude() default {};String[] excludeName() default {};}
@Import导入一个或者多个Configuration
AutoConfigurationImportSelector自动装配的选择类
选择一些你想要导入的装配的类
public String[] selectImports(AnnotationMetadata annotationMetadata) {if (!this.isEnabled(annotationMetadata)) {return NO_IMPORTS;} else {//去获得自动装配的类AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());}}//getAutoConfigurationEntry方法protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {if (!this.isEnabled(annotationMetadata)) {return EMPTY_ENTRY;} else {AnnotationAttributes attributes = this.getAttributes(annotationMetadata);//获得一些默认的配置List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);configurations = this.removeDuplicates(configurations);Set exclusions = this.getExclusions(annotationMetadata, attributes);this.checkExcludedClasses(configurations, exclusions);configurations.removeAll(exclusions);configurations = this.getConfigurationClassFilter().filter(configurations);this.fireAutoConfigurationImportEvents(configurations, exclusions);return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);}}//此种方法在 AutoConfigurationImportSelector 类中protected List getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {List configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());//断言 , 如果为空会出现断言后的异常 , 可以看到有META-INF/spring.factoriesAssert.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;}
定位这个类 , 可以看到AutoConfigurationImportSelector在下面的这个jar包中
文章插图
一:找到对应的META-INF/spring.factories
1.找到对应的类信息 , 点进入
文章插图
文章插图
@ConditionalOnClass如上图 , 满足条件的时候进行加载
点进入tomcat看一下
文章插图
有默认端口号和hostname
2.回到META-INF/spring.factories找到WebMvcAutoConfiguration
文章插图
当我们使用@SpringBootApplication , 它会自动帮我们装配springmvc
文章插图
3.回到META-INF/spring.factories找到ServletWebServerFactoryAutoConfiguration
文章插图
点进去 , 会看到一个jar , 它这个类的含义是自动装配我们的web服务器 , 就是使用我们的内置tomcat
文章插图
- 对手|一加9Pro全面曝光,或是小米11最大对手
- 行业|现在行业内客服托管费用是怎么算的
- 王兴称美团优选目前重点是建设核心能力;苏宁旗下云网万店融资60亿元;阿里小米拟增资居然之家|8点1氪 | 美团
- 手机基带|为了5G降低4G网速?中国移动回应来了:罪魁祸首不是运营商
- 技术|做“视频”绿厂是专业的,这项技术获人民日报评论点赞
- 互联网|苏宁跳出“零售商”重组互联网平台业务 融资60亿只是第一步
- 页面|如何简单、快速制作流程图?上班族的画图技巧get
- 体验|闭上眼睛点外卖是什么感觉?时隔一年再次体验,进步令人欣慰
- 培育|跨境电商人才如何培育,长沙有“谱”了
- 再次|华为Mate40Pro干瞪眼?P50再次曝光,这次是真香!