当前位置: 代码网 > it编程>编程语言>Java > SpringBoot启动类注解详解:@SpringBootApplication到底包含了什么?

SpringBoot启动类注解详解:@SpringBootApplication到底包含了什么?

2026年07月17日 Java 我要评论
springboot启动类:@springbootapplicationpublic class myspringbootapplication { public static void mai

springboot启动类:

@springbootapplication
public class myspringbootapplication {
    public static void main(string[] args) {
        springapplication.run(myspringbootapplication.class, args);
    }
}

springboot的启动类上使用@springbootapplication注解标识,该注解试一个组合注解,包含多个其他注解。

@target({elementtype.type})
@retention(retentionpolicy.runtime)
@documented
@inherited
@springbootconfiguration
@enableautoconfiguration //开启自动配置功能
@componentscan(
    excludefilters = {@filter(
    type = filtertype.custom,
    classes = {typeexcludefilter.class}
), @filter(
    type = filtertype.custom,
    classes = {autoconfigurationexcludefilter.class}
)}
)
public @interface springbootapplication {
    @aliasfor(annotation = enableautoconfiguration.class )
    class<?>[] exclude() default {}; //排除哪些自动配置类
    @aliasfor(annotation = enableautoconfiguration.class )
    string[] excludename() default {};
    @aliasfor(annotation = componentscan.class, attribute = "basepackages" )
    string[] scanbasepackages() default {};
    @aliasfor(annotation = componentscan.class,attribute = "basepackageclasses")
    class<?>[] scanbasepackageclasses() default {};
}

@springbootapplication注解上标有三个注解@springbootconfiguration 、@enableautoconfiguration 、@componentscan。

@componentscan是spring中的注解,用来与配置类上,定义要扫描的组件。 其他两个注解则是springboot自定义的注解。

下面就来看看这两个注解的作用。

@springbootconfiguration 

@target({elementtype.type})
@retention(retentionpolicy.runtime)
@documented
@configuration
public @interface springbootconfiguration {
}

@springbootconfiguration注解中没有定义任何属性信息,而该注解上有一个注解@configuration,用于标识配置类。

所以@springbootconfiguration注解的功能和@configuration注解的功能相同,用于标识配置类。

@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 {};
}

@enableautoconfiguration注解上标注了两个注解,@autoconfigurationpackage、@import。

@import注解在springioc一些注解的源码中比较常见,主要用来给容器导入目标bean。

这里@import注解给容器导入的组件用于自动配置:

autoconfigurationimportselector ; 而@autoconfigurationpackage注解试spring自定义的注解,用于扫描启动类所在的包及其子包下的自定义类。

@autoconfigurationpackage

@target({elementtype.type})
@retention(retentionpolicy.runtime)
@documented
@inherited
@import({registrar.class})
public @interface autoconfigurationpackage {
}

@autoconfigurationpackage注解上的@import注解,给容器导入了registrar组件

registrar:

    static class registrar implements importbeandefinitionregistrar, determinableimports {
        registrar() {
        }
        //拿到注解的全信息,注解所造包及其子包下的组件
        public void registerbeandefinitions(annotationmetadata metadata, beandefinitionregistry registry) {
            autoconfigurationpackages.register(registry, (new autoconfigurationpackages.packageimport(metadata)).getpackagename());
        }
        public set<object> determineimports(annotationmetadata metadata) {
            return collections.singleton(new autoconfigurationpackages.packageimport(metadata));
        }
    }

registrar是抽象类autoconfigurationpackages的内部静态类,registrar内的方法registerbeandefinitions负责将获取到的注解所在的包及其子包下的所有组件注册进容器。

这也是为什么springboot的启动类要在其他类的父包或在同一个包中。

autoconfigurationimportselector 

public class autoconfigurationimportselector 
            implements deferredimportselector, beanclassloaderaware, resourceloaderaware, 
            beanfactoryaware, environmentaware, ordered {
            .........
}

autoconfigurationimportselector 类实现类很多aware接口,而aware接口的功能是使用一些spring内置的实例获取一些想要的信息,如容器信息、环境信息、容器中注册的bean信息等。

而autoconfigurationimportselector 类的作用是将spring中已经定义好的自动配置类注入容器中(但是的时候不发挥配置类的作用),而实现该功能的方法是selectimports方法:

selectimports:注册spring中定义好的配置类

    public string[] selectimports(annotationmetadata annotationmetadata) {
        if (!this.isenabled(annotationmetadata)) {
            return no_imports;
        } else {
            autoconfigurationmetadata autoconfigurationmetadata = autoconfigurationmetadataloader.loadmetadata(this.beanclassloader);
            autoconfigurationimportselector.autoconfigurationentry autoconfigurationentry = this.getautoconfigurationentry(autoconfigurationmetadata, annotationmetadata);
            return stringutils.tostringarray(autoconfigurationentry.getconfigurations());
        }
    }

导入的配置类:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com