springboot项目启动原理_spring原理和实现机制

springboot项目启动原理_spring原理和实现机制SpringBoot启动类:@SpringBootApplicationpublicclassMySpringbootApplication{publicstaticvoidmain(String[]args){SpringApplication.run(MySpringbootApplication.class,args);}…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

SpringBoot启动类:

@SpringBootApplication
public class MySpringbootApplication {

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

}

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

@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());
        }
    }

导入的配置类:
springboot项目启动原理_spring原理和实现机制

 

推荐阅读:40 篇原创干货,带你进入 Spring Boot 殿堂

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197480.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • NFV基础技术_零基础

    NFV基础技术_零基础网络虚拟化技术,即用软件来安装、控制、操作那些运行在通用硬件上的网络功能,融合了云和虚拟化技术,使得新一代网络业务拥有更好的伸缩性和自动化能力。这些新涌现的技术经常被不加区分地称为NFV(网络功能虚拟化)和SDN(软件定义网络),虽然二者有逐渐融合之势,但二者的初衷和架构并不相同:SDN起源于园区网,发展于数据中心,目的是将控制平面和转发平面分离,通过集中化的控制平面能够灵活定义网络行为。N…

    2025年8月28日
    8
  • 网页内容变化监控提醒

    网页内容变化监控提醒有很多的人都需要查看网站的变化并且提醒,比如说股票的股市,商品的价格等等。这次案例以实时监控天气温度来简要的说明监控方法,监控的时广州的实时气温,网站会不断的更新当前的气温。首先打开软件网页自动操作通用工具PageOperator,在任务菜单中新建一个刷新操作。点击添加按钮,并把网址输入到对应的地方。点击自动获取,获取网站的编码方案,点击添加,…

    2022年7月17日
    47
  • socket通讯相互发送读取xml实例「建议收藏」

    socket通讯相互发送读取xml实例「建议收藏」socket通讯相互发送读取xml实例

    2022年4月23日
    52
  • MySQL慢查询日志分析详解[通俗易懂]

    MySQL慢查询日志分析详解[通俗易懂]MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10S以上的语句。默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢…

    2022年10月12日
    3
  • 二叉树的先序,中序,后序遍历的序列_二叉树先序遍历和后序遍历正好相反

    二叉树的先序,中序,后序遍历的序列_二叉树先序遍历和后序遍历正好相反    二叉树的遍历主要有三种:(1)先(根)序遍历(根左右)(2)中(根)序遍历(左根右)(3)后(根)序遍历(左右根)举个例子:先(根)序遍历(根左右):ABDHEICFJKG中(根)序遍历(左根右):DHBEIAJFKCG后(根)序遍历(左右根):HDIEBJKFGCA    以后(根)序…

    2025年11月18日
    3
  • 2021 pycharm 激活码【注册码】

    2021 pycharm 激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号