SpringBoot注解的作用

  1. @SpringBootApplication: 来源于spring-boot-starter,springboot的核心注解。
    SpringBoot标注在某一个类上,说明该类是SpringBoot的主配置类,运行这个类的main方式启动SpringBoot应用。

  2. @SpringBootConfiguration: 声明是springboot的配置类
    @Configuration: 声明是配置类
    注意:这两个注解,一个用于springboot中,一个用于spring中

  3. **@ComponentScan:**开启注解扫描

  4. @Target(ElementType.TYPE)、@Retention(RetentionPolicy.RUNTIME)、@Documented:这三个是元注解,修饰注解。

  5. @EnableAutoConfiguration: 开启自动装配的核心注解
    点进去,有一个核心的功能:@Import(AutoConfigurationImportSelector.class):自动导入选择器、筛查器。

  6. @Import(AutoConfigurationImportSelector.class) :自动配置选择器、筛查器(增强版)
    点击AutoConfigurationImportSelector.class进入,找到getAutoConfigurationEntry()方法(核心方法),点击该方法,跳转到该方法所在位置。
    下面是getAutoConfigurationEntry()方法自动配置的核心代码:

    java 复制代码
    /**
     * 获取自动配置条目 - Spring Boot自动配置的核心方法
     * @param annotationMetadata @EnableAutoConfiguration注解的元数据
     * @return 自动配置条目,包含需要导入的配置类列表
     */
    protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
        
        // 1. 检查自动配置是否启用
        // 如果@EnableAutoConfiguration的enabled属性为false,返回空条目
        if (!isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;  // 返回空配置,不进行任何自动配置
        }
        
        // 2. 获取@EnableAutoConfiguration注解的属性
        // 例如:exclude, excludeName等属性
        AnnotationAttributes attributes = getAttributes(annotationMetadata);
        
        // 3. 获取所有候选的自动配置类
        // 从META-INF/spring.factories文件中读取key为
        // org.springframework.boot.autoconfigure.EnableAutoConfiguration的所有配置类
        List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
        
        // 4. 移除重复的配置类(可能在不同jar包中重复定义)
        configurations = removeDuplicates(configurations);
        
        // 5. 获取需要排除的配置类
        // 从@EnableAutoConfiguration的exclude和excludeName属性获取
        Set<String> exclusions = getExclusions(annotationMetadata, attributes);
        
        // 6. 检查排除的类是否有效
        // 确保要排除的类确实在候选配置列表中
        checkExcludedClasses(configurations, exclusions);
        
        // 7. 从候选配置中移除被排除的配置类
        configurations.removeAll(exclusions);
        
        // 8. 使用自动配置过滤器进行过滤
        // Spring Boot 2.7+新增的机制,通过@AutoConfiguration注解的before/beforeName等属性排序和过滤
        configurations = getConfigurationClassFilter().filter(configurations);
        
        // 9. 触发自动配置导入事件
        // 允许监听器在自动配置类被导入前进行干预
        fireAutoConfigurationImportEvents(configurations, exclusions);
        
        // 10. 返回最终的自动配置条目
        // 包含经过所有处理后的配置类列表和排除的类
        return new AutoConfigurationEntry(configurations, exclusions);
    }
  7. **@AutoConfigurationPackage:**自动配置包

  8. @Import(AutoConfigurationPackages.Registrar.class): 自动配置,注册基础包路径
    在**@AutoConfigurationPackage** 注解中
    核心逻辑:

    java 复制代码
    // AutoConfigurationPackages.Registrar 的核心逻辑
    static class Registrar implements ImportBeanDefinitionRegistrar {
        @Override
        public void registerBeanDefinitions(
                AnnotationMetadata metadata, 
                BeanDefinitionRegistry registry) {
            
            // 1. 获取被@AutoConfigurationPackage注解的类所在的包
            // 通常是主启动类所在的包
            PackageImport packageImport = new PackageImport(metadata);
            
            // 2. 将这个包路径注册到Spring容器中
            register(registry, packageImport.getPackageName());
        }
    }
  9. **@Import(EnableAutoConfigurationImportSelector.class):**自动配置选择器(SpringBot 1.x版本),基本自动配置加载。

执行流程时间线:

java 复制代码
应用启动
    ↓
@SpringBootApplication生效
    ↓
├─ @ComponentScan执行
│   ↓
│   扫描当前包及子包下的@Component、@Service等
│
└─ @EnableAutoConfiguration执行
    ↓
    ├─ @AutoConfigurationPackage
    │   ↓
    │   AutoConfigurationPackages.Registrar.registerBeanDefinitions()
    │   ↓
    │   注册主类包路径到BasePackages
    │
    └─ @Import(AutoConfigurationImportSelector.class)
        ↓
        AutoConfigurationImportSelector.selectImports()
        ↓
        加载并过滤所有自动配置类
        ↓
        导入符合条件的配置类到Spring容器

项目结构:

java 复制代码
com.example.myapp
├── Application.java          # @SpringBootApplication
├── controller
│   └── UserController.java   # 会被@ComponentScan扫描到
├── service
│   └── UserService.java      # 会被@ComponentScan扫描到
└── entity
    └── User.java            # JPA实体,需要基础包信息
相关推荐
咩咩啃树皮5 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚5 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白6 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司7 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地8 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun3141598 小时前
TCP超时重传机制是为了解决什么问题?
java
莫逸风11 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
隔窗听雨眠11 小时前
Spring Boot在云原生时代的编程范式革新研究
spring boot·后端·云原生
z1234567898611 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin52112312 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python