SpringBoot中 @SpringBootApplication注解详解

SpringBoot中 @SpringBootApplication注解详解

@SpringBootApplication是SpringBoot框架中的一个重要注解,它简化了Spring应用的配置过程。它是几个注解的组合,旨在减少开发者需要编写的配置量,使得创建独立的、生产级别的基于Spring的应用变得非常简单。

源码:

@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 {
    // 具体实现忽略...    
}

@SpringBootApplication 注解的底层原理

  • Spring Boot 应用启动:应用程序启动时,Spring Boot 会加载带有 @SpringBootApplication 注解的主配置类。

  • 解析 @SpringBootApplication 注解:解析该注解,启用 @Configuration@EnableAutoConfiguration@ComponentScan

  • 解析 @Configuration 注解:创建并注册配置类实例到容器。

  • 解析 @EnableAutoConfiguration 注解:加载自动配置类,创建并注册自动配置 Bean 到容器。

  • 解析 @ComponentScan 注解:扫描指定包下的组件(如 @Component, @Service, @Repository, @Controller 等),创建并注册这些组件到容器。

  • 初始化 Spring 容器:初始化容器中的所有 Bean。

  • 启动嵌入式服务器:启动嵌入式服务器(如 Tomcat)。

  • 应用启动完成:应用程序启动完成。

组合注解

  • @SpringBootConfiguration

    @SpringBootConfiguration是一个自定义注解,他实际上就是@Configuration的别名

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {}
  • 作用:标记该类为一个配置类,Spring容器会扫描并处理其中的Bean定义。

  • @EnableAutoConfiguration

    @EnableAutoConfiguration注解用于启用SpringBoot的自动配置机制。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
  • 作用:SpringBoot会根据项目中包含的jar包依赖来自动配置应用程序。例如,如果项目中包含了Spring Data JPA的依赖,SpringBoot将自动配置数据源和JPA实体管理器。

    实现:

    1. @AutoConfigurationPackage:将当前配置类所在的包及其子包中的所有@Configuration类自动注册为Bean

    2. @Import(AutoConfigurationImportSelector.class):导入AutoConfigurationImportSelector类,该类负责选择和加载所有符合条件的自动配置类。

  • @ComponentScan

    @ComponentScan注解用于自动扫描并加载符合条件的组件或Bean

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {

    String value() default "";

    String[] basePackages() default {};

    Class<?>[] basePackageClasses() default {};

    Class<?>[] excludeFilters() default {};

    Class<?>[] includeFilters() default {};

    FilterType filter() default FilterType.ANNOTATION;

    boolean useDefaultFilters() default true;

    ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;

    boolean lazyInit() default false;
}
  • 作用:自动扫描并加载符合条件的组件或Bean,无需显示使用@Bean注解或XML配置文件来注册Bean

    实现:

    1. excludeFilters():排除某些特定的过滤器,例如TypeExcludeFilter(自定义的过滤器,用于排除某些特定类型的类)AutoConfigurationExcludeFilter(自定义的过滤器,用于排除某些自动配置类)。

    2. basePackage和basePackageClasses:指定扫描的基础包和基础类。

小结

  • @SpringBootApplication 注解通过组合 @SpringBootConfiguration@EnableAutoConfiguration@ComponentScan 注解,简化了 Spring Boot 应用的配置过程。

  • @SpringBootConfiguration 标记该类为一个配置类。

  • @EnableAutoConfiguration 启用自动配置机制,根据项目依赖自动配置应用程序。

  • @ComponentScan 自动扫描并加载符合条件的组件或 Bean。

  • 过滤器 TypeExcludeFilterAutoConfigurationExcludeFilter 用于排除某些特定的类或自动配置类。

通过这些注解和过滤器的组合,@SpringBootApplication 注解能够极大地简化 Spring Boot 应用的启动和配置过程,使开发者能够快速搭建起一个功能完备的应用程序框架。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楠寻寻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值