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实体,需要基础包信息
相关推荐
qq_297574671 小时前
【实战教程】SpringBoot 实现多文件批量下载并打包为 ZIP 压缩包
java·spring boot·后端
老毛肚1 小时前
MyBatis插件原理及Spring集成
java·spring·mybatis
学嵌入式的小杨同学2 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
lang201509282 小时前
JSR-340 :高性能Web开发新标准
java·前端·servlet
Re.不晚2 小时前
Java入门17——异常
java·开发语言
缘空如是2 小时前
基础工具包之JSON 工厂类
java·json·json切换
追逐梦想的张小年3 小时前
JUC编程04
java·idea
好家伙VCC3 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
南极星10053 小时前
蓝桥杯JAVA--启蒙之路(十)class版本 模块
java·开发语言
消失的旧时光-19433 小时前
第十三课:权限系统如何设计?——RBAC 与 Spring Security 架构
java·架构·spring security·rbac