SpringBootApplication注解——史上最全最详细

本文详细解析了SpringBootApplication注解的各个组成元素,包括@Target、@Retention、@Documented、@Inherited以及@SpringBootConfiguration和@EnableAutoConfiguration的作用。@Target定义了注解的使用范围,@Retention控制注解的生命周期,@Documented指示注解应包含在文档中,@Inherited允许子类继承父类的注解。@SpringBootConfiguration相当于Spring的@Configuration,用于配置类。@EnableAutoConfiguration则是Spring Boot的核心,启动自动配置功能。自动配置涉及到@AutoConfigurationPackage和@Import,它们分别负责包扫描和导入配置类。通过对这些概念的了解,可以更好地掌握Spring Boot的初始化过程。

SpringBootApplication

话不多说,先写三遍:SpringBootApplication、SpringBootApplication、SpringBootApplication

我们先来看看SpringBootApplication里面是啥

1.Target

这是个啥?  它是用于设定注解范围(被描述的注解可以用在什么地方)也急速hi限制了注解的作用域,那啥是注解的范围?注解的范围又有哪些呢?

@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。

/** Class, interface (including annotation type), or enum declaration */
    TYPE,
    //类,接口,枚举类
    /** Field declaration (includes enum constants) */
    FIELD,
    //枚举
    /** Method declaration */
    METHOD,
    //只用于方法
    /** Formal parameter declaration */
    PARAMETER,
       
    /** Constructor declaration */
    CONSTRUCTOR,
    //构造方法
    /** Local variable declaration */
    LOCAL_VARIABLE,
    
    /** Annotation type declaration */
    ANNOTATION_TYPE,

    /** Package declaration */
    PACKAGE,

    /**
     * Type parameter declaration
     *
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * Use of a type
     *
     * @since 1.8
     */
    TYPE_USE

@Target(ElementType.TYPE) //注解的作用域
@Retention(RetentionPolicy.RUNTIME) //注解的生存周期
@Documented //可以被文档化
@Inherited //注解用于标注一个父类的注解是否可以被子类继承
@SpringBootConfiguration //声明为一个配置类 proxyBeanMethods是否开启bean代理,默认是true,从IOC容器中取;如果是false则每次获取都是一个新的实例
@EnableAutoConfiguration //开启自动配置---这个将是我们研究的重点
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) //包扫描的规则

 https://www.cnblogs.com/unknows/p/10261539.html

2.Retention

说明:Retention定义了被它注解了的注解可以保留多久,我们点如它的枚举类型看看

    /**
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,

    /**
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     */
    CLASS,

    /**
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME

source:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;被编译器忽略

class:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期

runtime:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在

生命周期:runtime>class>source

3.@Documented

注解表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中,是一个标记注解,没有成员。

4.@Inherited

如果一个类用上了@Inherited修饰的注解,那么其子类也会继承这个注解

5.@SpringBootConfiguration

SpringBootConfiguration与Spring中的@Configuation的作用基本一致,只不过@SpringBootConfiguration是springboot的注解,而@Configuration是spring的注解。

  1. @Configuration 可以理解为一个Configuration就是对应的一个Spring的xml版的容器;(beans)

@configuation的作用,实现IOC的关键

 @Configuation等价于<Beans></Beans>

 @Bean等价于<Bean></Bean>

 @ComponentScan等价于<context:component-scan base-package=”com.dxz.demo”/>

6.@EnableAutoConfiguration

自动装配

Target、Retention、Documentd就不用我过多描述了,我们来看看

6.1@AutoConfigurationPackage这个注解

顾名思义:他的中文意思就是自动配置包(我的直译)

我们再来看看@autoConfigurationPackage里面是啥

 6.1.1 @Import

这个注解类是用于导入配置类或者一些需要前置加载的类,你就当作Import 包.类

6.1.2  AutoConfigurationpackages.Registrar.class

这就话其实是引用AutoConfigurationpackages抽象类里面的Registrar类

我们点进去来看看:

 这个类实现了哪些接口我们就不管了,我们直接来看它重写的两个方法:在registerBeanDefinitions方法中,我们可以从左到右读他的方法体,register(register,新建一个PackageImports匿名对象,将metadata这个对象形参填入,然后使用getPackageNames方法填入数组)

其实这就是扫描主配置类同级目录以及子包,然后一一记录下来,并将相应的组件导入到springboot创建管理的容器中。

这里我们大概就明白了@AutoConfigurationPackage这个注解的意思了,其实就是自动扫描包,并记录下来的注解,不过我们要明白的是它的作用范围是同级的包,以及以下的包,如果有包在@AutoConfigurationPackage注解范围以上,那么@AutoConfigurationPackage就扫描不到这个包。

6.2 AutoConfigurationImportSelector.class

我们先看看它的结构

虽然说这个类的变量很多,但是我们仍然可以看到几个带有bean、filter的变量名,那我们可以肯定这个类和bean(类的代理或代言人(实际上确实是通过反射、代理来实现的))以及filter(过滤器)有乱七八糟的关系

猜想已经确定了,我们再来看看方法体,来看我们的猜想是不是正确的。

protected Class<?> getSpringFactoriesLoaderFactoryClass() {
		return EnableAutoConfiguration.class;
	}

这个方法体的名字叫做(我的直译):得到spring的工厂加载工厂类

工厂加载工厂类?我咋感觉像是实现IOC的嘞?我们再来看看返回的是啥?

return EnableAutoConfiguration.class;

返回一个EnableAutoConfiguration类,我知乎内行。

这个方法看不出啥,我们在来看看有没有调用它的方法,搜索了一下还真有。

	/**
	 * Return the auto-configuration class names that should be considered. By default
	 * this method will load candidates using {@link SpringFactoriesLoader} with
	 * {@link #getSpringFactoriesLoaderFactoryClass()}.
	 * @param metadata the source metadata
	 * @param attributes the {@link #getAttributes(AnnotationMetadata) annotation
	 * attributes}
	 * @return a list of candidate configurations
	 */
	protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
		List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
				getBeanClassLoader());
		Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
				+ "are using a custom packaging, make sure that file is correct.");
		return configurations;
	}

<think>我们正在讨论@SpringBootApplication注解。根据引用内容,该注解是SpringBoot的核心注解,它简化了SpringBoot应用的配置过程。下面我将详细解释该注解的功能、组成和使用方法。###功能@SpringBootApplication注解的主要功能是简化SpringBoot应用的配置。它通过组合三个注解来实现:1.**配置简化**:替代了传统的多个配置类。2.**自动装配**:根据项目依赖自动配置Spring应用。3.**组件扫描**:自动扫描当前包及其子包中的组件(如@Service,@Controller等)。###组成从引用[1][2][3][4]中可以看出,@SpringBootApplication是一个组合注解,它包含三个核心注解:1.**@SpringBootConfiguration**:-表明该类是一个配置类,允许在上下文中注册额外的Bean或导入其他配置类。-它本身是@Configuration的派生注解,因此具有相同的功能[^4]。2.**@EnableAutoConfiguration**:-启用SpringBoot的自动配置机制,根据类路径中的jar包依赖自动配置Bean。-例如:如果类路径中有`spring-boot-starter-web`,则自动配置Tomcat和SpringMVC[^4]。3.**@ComponentScan**:-自动扫描当前包及其子包下的组件(如@Component,@Service,@Repository,@Controller等),并将它们注册为SpringBean。-默认扫描启动类所在包及其所有子包[^3]。###使用方法####1.基本用法将@SpringBootApplication注解标注在**主启动类**上:```java@SpringBootApplication//核心注解publicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);//启动SpringBoot}}```####2.常用属性@SpringBootApplication提供了以下常用属性(引用[1]):-**scanBasePackages**:自定义组件扫描的包路径。```java@SpringBootApplication(scanBasePackages={"com.example.service","com.example.controller"})```-**exclude**:显式排除特定的自动配置类。```java@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})```-**excludeName**:通过类名排除自动配置类(字符串形式)。```java@SpringBootApplication(excludeName={"org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration"})```####3.高级场景-**多配置类支持**:如果需拆分配置,可用`@Import`导入其他配置类:```java@SpringBootApplication@Import({SecurityConfig.class,SwaggerConfig.class})publicclassApplication{...}```-**禁用组件扫描**:若需完全手动控制Bean注册,可移除`@ComponentScan`:```java@SpringBootConfiguration@EnableAutoConfigurationpublicclassApplication{...}//此时需手动注册所有Bean```###自动装配原理(引用[4])1.**条件装配**:`@EnableAutoConfiguration`利用`@Conditional`系列注解(如`@ConditionalOnClass`)按需加载配置。2.**加载路径**:从`META-INF/spring.factories`文件中读取自动配置类列表。3.**优先级**:用户自定义配置优先于自动配置(如定义自己的`DataSource`Bean会覆盖自动配置)。---###§相关问题§1.如何覆盖SpringBoot的自动配置?2.`@SpringBootApplication`的扫描范围如何影响Bean的注册?3.在SpringBoot中如何排除特定的自动配置类?4.`@SpringBootConfiguration`和`@Configuration`有什么区别?5.如何自定义`spring.factories`文件实现自己的自动配置?</think>### @SpringBootApplication 注解详解 #### 一、核心功能 @SpringBootApplication 是 Spring Boot 的核心注解,通过组合三个关键注解实现三大功能: 1. **配置简化**:替代传统 Spring 的 XML 配置 2. **自动装配**:根据依赖自动配置组件(如数据库连接、Web 服务器等) 3. **组件扫描**:自动发现并注册 Bean(如 `@Controller`, `@Service` 等)[^3][^4] #### 二、注解组成 从源码角度分析其结构(引用[1][2][4]): ```java @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan public @interface SpringBootApplication { ... } ``` | 子注解 | 功能说明 | 示例场景 | |-------------------|--------------------------------------------------------------------------|------------------------------| | `@SpringBootConfiguration` | 标识主配置类(实质是 `@Configuration` 的特化) | 定义自定义 Bean 的配置类 | | `@EnableAutoConfiguration` | 启用自动装配机制,根据类路径依赖自动配置组件 | 自动配置数据源、Web MVC 等 | | `@ComponentScan` | 扫描当前包及子包的 Spring 组件(`@Component`, `@Service` 等) | 自动注册 Controller 和 Service | #### 三、关键属性配置 通过属性可定制化行为(引用[1][4]): ```java @SpringBootApplication( scanBasePackages = "com.example", // 自定义扫描路径 exclude = {DataSourceAutoConfiguration.class}, // 排除特定自动配置 excludeName = "org.example.CustomConfig" // 按类名排除配置 ) ``` #### 四、使用方法 1. **基础用法**(90% 场景适用): ```java @SpringBootApplication public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); // 启动Spring Boot } } ``` - 默认扫描**启动类所在包及其子包** - 自动配置 Tomcat/Jetty、Spring MVC 等组件 2. **多模块项目配置**: ```java @SpringBootApplication(scanBasePackages = { "com.module.a", "com.module.b" }) ``` 3. **排除自动配置**(如禁用数据库): ```java @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) ``` #### 五、工作原理 1. **启动流程**: ```mermaid graph TD A[SpringApplication.run] --> B[加载@SpringBootApplication] B --> C[@ComponentScan 注册Bean] B --> D[@EnableAutoConfiguration 加载自动配置] D --> E[读取META-INF/spring.factories] E --> F[按条件装配Bean] ``` 2. **自动装配机制**: - 检查类路径依赖(如存在 `spring-boot-starter-web` → 自动配置 Tomcat) - 通过 `@Conditional` 系列注解实现条件化装配(如 `@ConditionalOnClass`) - 配置优先级:用户自定义 Bean > 自动配置 Bean[^4] #### 六、佳实践 1. **位置要求**:必须放在**主启动类**上(根包或接近根包位置) 2. **自定义配置**:优先使用属性配置而非覆盖自动配置类 3. **调试技巧**:启动时添加 `--debug` 参数查看自动配置报告 ``` Positive matches: WebMvcAutoConfiguration matched DataSourceAutoConfiguration matched ``` --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值