springboot是如何自动装配的

简述:springboot启动类详解
springboot是如何自动装配的文章插图
接下来都是围绕着这个启动类进行介绍
一.点进去run方法 , 可以看到
springboot是如何自动装配的文章插图
它可以去跑spring的一个实例 , 传参方式 , 任意一个类型的类和一个String数组,它会使用默认的配置 , 比如@SpringBootApplication,它会运行一个上下文对象
1.@SpringBootApplication的应用
点进去看下
springboot是如何自动装配的文章插图
①:@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包中
springboot是如何自动装配的文章插图
一:找到对应的META-INF/spring.factories
1.找到对应的类信息 , 点进入
springboot是如何自动装配的文章插图
springboot是如何自动装配的文章插图
@ConditionalOnClass如上图 , 满足条件的时候进行加载点进入tomcat看一下
springboot是如何自动装配的文章插图
有默认端口号和hostname
2.回到META-INF/spring.factories找到WebMvcAutoConfiguration
springboot是如何自动装配的文章插图
当我们使用@SpringBootApplication , 它会自动帮我们装配springmvc
springboot是如何自动装配的文章插图
3.回到META-INF/spring.factories找到ServletWebServerFactoryAutoConfiguration
springboot是如何自动装配的文章插图
点进去 , 会看到一个jar , 它这个类的含义是自动装配我们的web服务器 , 就是使用我们的内置tomcat
springboot是如何自动装配的文章插图