springboot 自动装配_springboot是如何自动装配的

本文围绕Spring Boot启动类展开介绍。点进run方法,它会运行Spring实例并使用默认配置。@SpringBootApplication包含@SpringBootConfiguration和@EnableAutoConfiguration,后者用于开启自动装配。通过定位AutoConfigurationImportSelector类,可在META - INF/spring.factories中找到各类自动装配信息,如Tomcat、Spring MVC等。

简述:springboot启动类详解

9eed8be7f6fefb260ea71280ec0f379f.png

接下来都是围绕着这个启动类进行介绍


一.点进去run方法,可以看到

9c2d9a645d14f3bb4ff75349c373f88c.png

它可以去跑spring的一个实例,传参方式,任意一个类型的类和一个String数组,它会使用默认的配置,比如@SpringBootApplication,它会运行一个上下文对象

1.@SpringBootApplication的应用

点进去看下

5e9987b042b5f64dbf939784b2de7e7f.png

①:@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.factories        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;    }

定位这个类,可以看到AutoConfigurationImportSelector在下面的这个jar包中

304893fa6da44944320e364bac7362ce.png

一:找到对应的META-INF/spring.factories

1.找到对应的类信息,点进入

3f8b21b5820ab32d8c23dd726fb76117.png
2eb97c5a62e24f44a670b00de90e843c.png
@ConditionalOnClass如上图,满足条件的时候进行加载

点进入tomcat看一下

4d39828673177c3ea1d1bd1be83ec14a.png

有默认端口号和hostname

2.回到META-INF/spring.factories找到WebMvcAutoConfiguration

0f5b3b2edebe27a2b1ce37e816af9adc.png

当我们使用@SpringBootApplication,它会自动帮我们装配springmvc

15de1c2f409db5a1fa08e2f5b6ea526a.png

3.回到META-INF/spring.factories找到ServletWebServerFactoryAutoConfiguration

2b89a807c919cce19a0e45f1f3eeb149.png

点进去,会看到一个jar,它这个类的含义是自动装配我们的web服务器,就是使用我们的内置tomcat

55cd6d3fe62b5a961538d9bd0186f2a4.png
startup是用于启动tomcat的一个命令

4.META-INF/spring.factories还包含很多类

//springboot所推荐的一个模板配置类org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,//事务装配的自动类org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,k.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,//事务装配的自动类org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:

https://blog.youkuaiyun.com/kawayiyy123/article/details/109386102

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值