java
@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)、属性校验等增强操作
-
注解是标签:通过反射识别,告诉框架"我是什么"、"我要什么" 🤭