千家信息网

springBoot自动注入原理的示例分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章给大家分享的是有关springBoot自动注入原理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。@SpringBootApplication注解解读为什么
千家信息网最后更新 2026年11月02日springBoot自动注入原理的示例分析

这篇文章给大家分享的是有关springBoot自动注入原理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

    @SpringBootApplication注解解读

    为什么我们的启动类上标注一个@SpringBootApplication注解,再加一个run()方法就可运行起来,可以看出我们的@SpringBootApplication注解是多么的强大。

    @SpringBootApplicationpublic class App {    public static void main(String[] args) {        SpringApplication.run(App.class, args);    }}

    @SpringBootApplication其实是由三个字注解来合成的。我们可以完全用这个三个注解来替换掉@SpringBootApplication。

    @SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),        @ComponentScan.Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })public class App {    public static void main(String[] args) {        SpringApplication.run(App.class, args);    }}

    我们来说下这三个注解的一个作用,分别做了什么事情,为什么区区几个注解就可以让我们的程序跑起来。

    1.@SpringBootConfiguration

    其实点击进去就是一个 @Configuration,没什么特别的,学习过spring的朋友都知道,这是用于标注一个配置类的。

    2.@EnableAutoConfiguration

    重点就是在于@EnableAutoConfiguration 这个注解,我们先看下他的一个构成。

    @Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage@Import(AutoConfigurationImportSelector.class)public @interface EnableAutoConfiguration {

    @Inherited

    @Inherited : 如果标注此注解标识子类也可以进行继承,这个不太重要

    我们先来看.@EnableAutoConfiguration 注解中的@AutoConfigurationPackage注解里面的内容有什么 ? 可以看到导入了一个AutoConfigurationPackages.Registrar类型的组件

    @AutoConfigurationPackage

    @AutoConfigurationPackage:

    @Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@Import(AutoConfigurationPackages.Registrar.class)public @interface AutoConfigurationPackage {

    我们来看下导入的这个AutoConfigurationPackages.Registrar组件做了什么事情?

    registerBeanDefinitions? registerBeanDefinitions是不是就是往我们的容器中添加组件啊?那我们来看看他具体导入了那些组件。你可以将断点打在这两个方法上

     static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {                @Override                public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {                        register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));                }                @Override                public Set determineImports(AnnotationMetadata metadata) {                        return Collections.singleton(new PackageImports(metadata));                }        }

    只要把BeanDefinition注册进去,往后我们只要调用getBean()就会得到该对象,当然不一定得我们自己调用,spring在底层最后刷新容器的时候,就会初始化所有的单实例bean,这也就是为什么我们直接使用相关注解就可以获取到该对象的原有。

    getBean()有两层意思:

    1.容器中有直接从缓存中获取

    2.容器中没有直接创建一个,也就是走bean的生命周期创建

    AutoConfigurationImportSelector.class

    @Import(AutoConfigurationImportSelector.class) 核心组件,我们来看看他做了什么事情。

    AutoConfigurationImportSelector他呢继承了DeferredImportSelector,DeferredImportSelector他呢有个内部接口Group,而Group中又有个方法process()
    所以我们来到AutoConfigurationImportSelector中的process()方法打上断点进行观察

        @Override                public void process(AnnotationMetadata annotationMetadata, DeferredImportSelector deferredImportSelector) {                        Assert.state(deferredImportSelector instanceof AutoConfigurationImportSelector,                                        () -> String.format("Only %s implementations are supported, got %s",                                                        AutoConfigurationImportSelector.class.getSimpleName(),                                                        deferredImportSelector.getClass().getName()));                        AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationImportSelector) deferredImportSelector)                                        .getAutoConfigurationEntry(annotationMetadata);                        this.autoConfigurationEntries.add(autoConfigurationEntry);                        for (String importClassName : autoConfigurationEntry.getConfigurations()) {                                this.entries.putIfAbsent(importClassName, annotationMetadata);                        }                }

    这个方法一上来就要获取一些自动注入的条目autoConfigurationEntry,那我们看下他是怎么获取的,获取的究竟是什么东西?
    通过堆栈信息我们可以看到是通过invokeBeanDefinitionRegistryPostProcessors()这个方法调用过来的,说明在工厂初始化完毕,你可以往里面仍一些bean的定义信息了。

    进去就是这个方法

          protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {                if (!isEnabled(annotationMetadata)) {                        return EMPTY_ENTRY;                }                AnnotationAttributes attributes = getAttributes(annotationMetadata);                List configurations = getCandidateConfigurations(annotationMetadata, attributes);                configurations = removeDuplicates(configurations);                Set exclusions = getExclusions(annotationMetadata, attributes);                checkExcludedClasses(configurations, exclusions);                configurations.removeAll(exclusions);                configurations = getConfigurationClassFilter().filter(configurations);                fireAutoConfigurationImportEvents(configurations, exclusions);                return new AutoConfigurationEntry(configurations, exclusions);        }

    我们再进入这个方法

    在进入loadFactoryNames()方法中

    那我们去看看这个文件里面有什么

    结合上面的代码他是不是要加载org.springframework.boot.autoconfigure.EnableAutoConfiguration里面的内容,这些就是一些配置类的信息

    其实这个文件 spring.factories 里面的每一个类的权限的名称就是一个配置类,只不过springBoot把这些配置类都写好了,在我们某些场景需要的时候直接给你注入就行,这就说明了我们不用写那么多配置文件的原因。

    我随便点击一个类进去看看

    加载完成后: 怎么多?是不是全部第用得上啊?

    你看下面的代码,是不是要排除,移除掉,过滤掉一些啊,排除就是我们自己在注解中写的排除属性进行排除,让后就是经过一系列的筛选过滤。

    最后将这些信息put到entries中

    3.@ComponentScan

    @ComponentScan这个注解的功能就是扫描当前类上标注此注解所在包路径的所有类,这也就是为什么我们需要把主启动类放在最外面的原有,如果你想把配置类放在别的地方,那你就得自己手动指定包扫描路径.

    感谢各位的阅读!关于"springBoot自动注入原理的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

    注解 就是 方法 配置 组件 信息 内容 容器 三个 也就是 事情 文件 原理 示例 分析 上标 代码 对象 断点 时候 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技有限公司 伟宏互联网科技 互联网科技巨头监管 广州紫鲸互联网科技 盛创互联网科技有限公司 互联网教育科技公司vipkid 河南猎农互联网科技有限公司 滨湖区互联网智能科技产品有哪些 怎样加入科技互联网 互联网金融科技公司的优势 中国互联网有什么科技 杭州披云加互联网科技有限公司 从那以后互联网科技有限公司 广州互联网高科技取餐柜 济南小医互联网科技有限公司招聘 全球科技与互联网公司市值变化 科技互联网经济论坛 互联网的科技体现在哪里 科技互联网专业务虚会材料 恒生科技互联网指数十大成分股 上海喔噻互联网科技有限公司 疫情对互联网科技公司影响 互联网科技logo 兼蜜互联网科技 互联网科技公司实习生 富国互联网科技002692 互联网时代科技型公司的机会 北京天晋互联网科技有限公司 恒生科技指数 中概互联网 东风日产互联网科技公司叫什么
    0