spring容器启动流程(反射视角)
@Configuration
@ComponentScan
public class AppConfig {
}public class Application {public static void main(String[] args) {// 关键入口:将配置类交给Spring容器ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);}
}
配置类加载阶段
Spring通过反射读取
AppConfig.class
的元数据发现
@Configuration
注解,将其识别为配置类而非普通Bean解析
@ComponentScan
注解,获取要扫描的包路径(默认为当前包及其子包)
类路径扫描阶段
Spring使用反射API扫描指定包下的所有
.class
文件对每个类进行注解分析:
@Component
,@Service
,@Repository
,@Controller
等将符合条件的类注册为Bean定义(BeanDefinition)
Bean实例化阶段
通过反射调用无参构造器创建Bean实例:
clazz.newInstance()
对于有构造器注入的Bean,反射解析参数类型并注入依赖
依赖注入阶段
反射遍历所有字段,检查
@Autowired
注解通过
field.set(beanInstance, dependency)
注入依赖调用
@PostConstruct
标记的方法完成初始化
Bean后处理阶段
执行BeanPostProcessor进行额外的处理
代理创建(AOP)、属性校验等增强操作
注解是标签:通过反射识别,告诉框架"我是什么"、"我要什么" 🤭