SPRINGBOOT:【基础二】SpringBoot自动装配组件原理

目录

一、SpringBoot优势

二、SpringBoot实现组件自动装配的原理

三、组件自动装配的代码概览:

四、自动装配组件时属性初始化原理


一、SpringBoot优势

        jar包依赖引入区别:

        SpringBoot可以简单理解为是在Spring框架的基础上,做了升级。

        在使用Spring创建工程时,需要引入一系列的jar包,但是使用SpringBoot创建工程的时候,只需要引入**-start的jar包即可;

       xml配置区别:

        在使用Spring创建工程时需要配置xml文件;

        使用SpringBoot则可以通过JavaConfig来达到之前的效果:第三方插件,如aop,mvc都是使用@Configuration+@ConfigurationProperties注解来配置Spring的xml中配置<bean>标签的操作的。

二、SpringBoot实现组件自动装配的原理

        在SpringBoot程序的入口类上有个@SpringBootApplication注解。点击该注解,能看到这个注解上又标注了一堆注解,其中关键是@ComponentScan、@EnableAutoConfiguration 

  1. @ComponentScan:
    1. 该注解默认会扫描标注该注解类所在的包下所有的配置类
  2. @EnableAutoConfiguration:
    1. 该注解上有个@Import注解,导入了AutoConfigurationImportSelector.class
    2. @Import(AutoConfigurationImportSelector.class)
    3. AutoConfigurationImportSelector类中的SelectImport方法,通过 
      spring-boot-autoconfigure.jar/META-INF/spring.factories返回,将其注入到了IOC容器中
  3. 以上注解关系图如下:

三、组件自动装配的代码概览:

        实现组件自动装配的最外层的源代码如以下部分,大概分为三步:

  1. 该方法中,读取sprinbg.factories文件中key值=org.springframework.boot.autoconfigure.EnableAutoConfiguration下的所有字符串
  2. 去重
  3. 去重去除exclusion需要去除的组件
  4. 去除未添加依赖的组件<是从spring-autoconfigure-metadata.properties文件中读取的>
  5. 注册到容器
protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;
        } else {
            AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
            // 该方法中,读取sprinbg.factories文件中key值=org.springframework.boot.autoconfigure.EnableAutoConfiguration下的所有字符串
            List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
            // 去重
            configurations = this.removeDuplicates(configurations);
            // 去除exclusion
            Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
            this.checkExcludedClasses(configurations, exclusions);
            configurations.removeAll(exclusions);
            // 去除未添加依赖的组件<是从spring-autoconfigure-metadata.properties文件中读取的>
            configurations = this.getConfigurationClassFilter().filter(configurations);
            this.fireAutoConfigurationImportEvents(configurations, exclusions);
            // 注册到容器
            return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
        }
    }

四、自动装配组件时属性初始化原理

  1. 每个xxxAutoConfiguration文件都是通过@Conditionxxx、@EnableConfigurationProperties、@ConfigurationProperties,以及xxxProperties.class来设置默认值的。
    1. @Conditionxxx:一种校验的注解:
      1. @ConditionalOnClass : classpath中存在该类时起效
        @ConditionalOnMissingClass : classpath中不存在该类时起效
        @ConditionalOnBean : DI容器中存在该类型Bean时起效
        @ConditionalOnMissingBean : DI容器中不存在该类型Bean时起效
    2. @EnableConfigurationProperties(xxxProperties.class):
      1. 提供@ConfigurationProperies注解的支持
    3. 进入xxxProperties.properties会看到@ConfigurationProperties:
      1. 如:
        @ConfigurationProperties(prefix = "spring.kafka")
        public class KafkaProperties {
      2. 其中prefix=spring.kafka“”则表示,会去properties,或者yml文件中加载相关值

   

 
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值