SpringBoot——》@EnableAutoConfiguration注解

推荐链接:
    总结——》【Java】
    总结——》【Mysql】
    总结——》【Spring】

一、作用

开启自动配置

@EnableAutoConfiguration注解的定义中使用了@Import注解,导入AutoConfigurationImportSelector.class,作用等同于在Spring的xml文件中使用导入

在这里插入图片描述

二、自动配置过程

在这里插入图片描述

1、找到文件:META-INF/spring.factories

D:\repository\org\springframework\boot\spring-boot-autoconfigure\2.6.7\spring-boot-autoconfigure-2.6.7.jar!\META-INF\spring.factories
在这里插入图片描述

2)加载内容:org.springframework.boot.autoconfigure.EnableAutoConfiguration

值是一个列表,需要进行自动化配置的类的列表
在这里插入图片描述

在这里插入图片描述

3)去重、排他、过滤

selectImports() -> getAutoConfigurationEntry()
在这里插入图片描述

三、部分源码

1、接口:ImportSelector.java

在这里插入图片描述

2、接口:DeferredImportSelector

在这里插入图片描述

3、实现类:AutoconfigurationImportSelector

在这里插入图片描述

4、实现类:AutoConfigurationGroup

在这里插入图片描述

四、为什么没有执行selectImports()?

场景一:当getImportGroup()返回null时

场景:当getImportGroup()返回null时
结果:执行AutoConfigurationImportSelector.selectImports()

在这里插入图片描述

1、MyDeferredImportSelector.java

package com.example.test;

import org.springframework.context.annotation.DeferredImportSelector;
import org.springframework.core.type.AnnotationMetadata;

import java.util.ArrayList;
import java.util.List;

public class MyDeferredImportSelector implements DeferredImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        System.out.println("===selectImports===");
        return new String[0];
    }

    @Override
    public Class<? extends Group> getImportGroup() {
        System.out.println("===getImportGroup===");
        return null;
    }

    public static class MyGroup implements Group {
        public List<Entry> list = new ArrayList<>();

        @Override
        public void process(AnnotationMetadata metadata, DeferredImportSelector selector) {
            System.out.println("===process===");
        }

        @Override
        public Iterable<Entry> selectImports() {
            System.out.println("===MyGroup.selectImports===");
            return list;
        }
    }
}

2、JavaConfig.java

package com.example.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(MyDeferredImportSelector.class)
public class JavaConfig {
    public static void main(String[] args) {

        ApplicationContext ac = new AnnotationConfigApplicationContext(JavaConfig.class);
        System.out.println(ac);
    }
}

场景二:当getImportGroup()返回自定义Group时

场景:当getImportGroup()返回自定义Group时
结果:不执行AutoConfigurationImportSelector.selectImports()
执行MyGroup.process() -> MyGroup.selectImports()

Q:AutoConfigurationImportSelector.selectImports()为什么没有执行?
A:AutoConfigurationImportSelector.getImportGroup()返回的是AutoConfigurationGroup.class,所以没有执行

在这里插入图片描述

五、为什么DeferredImportSelector是延迟加载?

在ConfigurationClassParser.parse()中,先执行重载parse(),然后执行deferredImportSelectorHandler.process()
在这里插入图片描述

六、自动配置调用过程

1、AbstractApplicationContext

refresh() -> invokeBeanFactoryPostProcessors()

2、PostProcessorRegistrationDelegate

invokeBeanFactoryPostProcessors_() - > invokeBeanDefinitionRegistryPostProcessors()_

3、ConfigurationClassPostProcessor

postProcessBeanDefinitionRegistry() -> processConfigBeanDefinitions()

4、ConfigurationClassParser

parse() -> processConfigurationClass() -> doProcessConfigurationClass() -> processImports() -> parse()
在这里插入图片描述

parse():解析所有的@Configuration类
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5、DeferredImportSelectorHandler

process()
在这里插入图片描述

6、DeferredImportSelectorGroupingHandler

register() -> processGroupImports()
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值