springboot面试题

springboot如何完成自动装配?

springboot完成自动装配的主要功劳来自于 @SpringBootApplication注解

SpringBootApplication
从上图可以看出@SpringBootApplication 注解是一个复合注解,除一些元注解外还包含三个重要注解:@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan

@SpringBootConfiguration

在这里插入图片描述

  • @Configuration 标识当前类是一个IoC容器的配置类。
    每一个涉及到Enable开头的注解,都会带有一个@Import的注解。
@ComponentScan
  • 主要作用就是扫描指定路径下的标识了需要装配的类,自动装配到spring的Ioc容器中。
Import注解

import 注解是什么意思呢?参考 形式的注解,就知道它的作用。import就是把多个分来的容器配置合并在一个配置中。在JavaConfig中所表达的意义是一样的。

方式一:直接填class数组
方式二: ImportSelector方式【重点】

第一种方式如果导入的是一个配置类,那么该配置类中的所有的都会加载,如果想要更加的灵活,动态的去加载的话可以通过Import接口的第二种使用方式,也就是ImportSelector这种方式

方式三:ImportBeanDefinitionRegistrar方式

这种方式和第二种方式很相似,同样的要实现 ImportBeanDefinitionRegistrar 接口

@EnableAutoConfiguration

在这里插入图片描述
了解了ImportSelector和ImportBeanDefinitionRegistrar后,对于EnableAutoConfiguration的理解就容易一些了它会通过import导入第三方提供的bean的配置类:AutoConfigurationImportSelector

public String[] selectImports(AnnotationMetadata annotationMetadata) {
    if (!this.isEnabled(annotationMetadata)) {
        return NO_IMPORTS;
    } else {
        try {
// 加载META-INF/spring-autoconfigure-metadata.properties 下的元数据信息
            AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
            AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
// 获取候选加载的配置信息 META-INF/spring.factories
            List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
// 去掉重复的配置信息
            configurations = this.removeDuplicates(configurations);
// 排序
            configurations = this.sort(configurations, autoConfigurationMetadata);
            // 获取 注解中配置的 exclusion 信息
Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
// 检查
            this.checkExcludedClasses(configurations, exclusions);
// 移除需要排除的信息
            configurations.removeAll(exclusions);
// 过滤,检查候选配置类上的注解@ConditionalOnClass,如果要求的类不存在,则这个候选类会被过滤不被加载
            configurations = this.filter(configurations, autoConfigurationMetadata);
// 广播事件
            this.fireAutoConfigurationImportEvents(configurations, exclusions);
            // 返回要被加载的类数组
return (String[])configurations.toArray(new String[configurations.size()]);
        } catch (IOException var6) {
            throw new IllegalStateException(var6);
        }
    }
} 

实际上EnableAutoConfiguration会帮助springboot应用把所有符合@Configuration配置都加载到当前SpringBoot创建的IoC容器,而这里面借助了Spring框架提供的一个工具类SpringFactoriesLoader的支持。以及用到了Spring提供的条件注解@Conditional,选择性的针对需要加载的bean进行条件过滤。

  • SpringFactoriesLoader的作用是从classpath/META-INF/spring.factories文件中。(这个spring.factories文件也是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,这些类名以逗号分隔)
    在这里插入图片描述
  • AutoConfigurationImportSelector 会先扫描spring-autoconfiguration-metadata.properties文件,最后在扫描spring.factories对应的类时,会结合前面的元数据进行过滤。

springboot自动装配:

  • 重要注解:@SpringBootApplication 为复合注解:@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
  • @SpringBootConfiguration: 标识该类为一个配置类
  • @ComponentScan: spring原有的注解,扫描指定路径下需要装配的类,自动注入到容器中。
  • @EnableAutoConfiguration: 完成自动装配的核心注解。核心类为AutoConfigurationImportSelector
    • // 加载META-INF/spring-autoconfigure-metadata.properties 下的元数据信息
    • // 获取候选加载的配置信息 META-INF/spring.factories
    • // 去掉重复的配置信息
    • // 获取 注解中配置的 exclusion 信息
    • // 检查
    • // 移除需要排除的信息
    • // 过滤,检查候选配置类上的注解@ConditionalOnClass,如果要求的类不存在,则这个候选类会被过滤不被加载
    • // 广播事件
    • // 返回要被加载的类数组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

benboerdong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值