spring容器启动流程(反射视角)

java 复制代码
@Configuration
@ComponentScan
public class AppConfig {
}

public class Application {
    public static void main(String[] args) {
        // 关键入口:将配置类交给Spring容器
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
    }
}
  1. 配置类加载阶段

    • Spring通过反射读取AppConfig.class的元数据

    • 发现@Configuration注解,将其识别为配置类而非普通Bean

    • 解析@ComponentScan注解,获取要扫描的包路径(默认为当前包及其子包)

  2. 类路径扫描阶段

    • Spring使用反射API扫描指定包下的所有.class文件

    • 对每个类进行注解分析:@Component, @Service, @Repository, @Controller

    • 将符合条件的类注册为Bean定义(BeanDefinition)

  3. Bean实例化阶段

    • 通过反射调用无参构造器创建Bean实例:clazz.newInstance()

    • 对于有构造器注入的Bean,反射解析参数类型并注入依赖

  4. 依赖注入阶段

    • 反射遍历所有字段,检查@Autowired注解

    • 通过field.set(beanInstance, dependency)注入依赖

    • 调用@PostConstruct标记的方法完成初始化

  5. Bean后处理阶段

    • 执行BeanPostProcessor进行额外的处理

    • 代理创建(AOP)、属性校验等增强操作

注解是标签:通过反射识别,告诉框架"我是什么"、"我要什么" 🤭

相关推荐
章豪Mrrey nical2 小时前
前后端分离工作详解Detailed Explanation of Frontend-Backend Separation Work
后端·前端框架·状态模式
超级大只老咪3 小时前
数组相邻元素比较的循环条件(Java竞赛考点)
java
小浣熊熊熊熊熊熊熊丶3 小时前
《Effective Java》第25条:限制源文件为单个顶级类
java·开发语言·effective java
毕设源码-钟学长3 小时前
【开题答辩全过程】以 公交管理系统为例,包含答辩的问题和答案
java·eclipse
啃火龙果的兔子3 小时前
JDK 安装配置
java·开发语言
星哥说事3 小时前
应用程序监控:Java 与 Web 应用的实践
java·开发语言
派大鑫wink3 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
程序员爱钓鱼3 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
xUxIAOrUIII3 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端
Dolphin_Home3 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法