SpringBoot 之 AnnotationConfigApplicationContext
简介
1. 核心作用
加载注解配置:用于基于 Java 注解的配置方式创建 Spring 应用上下文,替代 XML 配置。
管理 Bean:解析 @Configuration 类,注册 @Bean 方法和 @Component 及其派生注解(如 @Service)定义的 Bean。
2. 初始化过程
构造方法:
java
Copy Code
// 无参构造
public AnnotationConfigApplicationContext() {
this.reader = new AnnotatedBeanDefinitionReader(this); // 初始化注解读取器
this.scanner = new ClassPathBeanDefinitionScanner(this); // 初始化扫描器
}
关键组件:
AnnotatedBeanDefinitionReader:解析 @Bean 方法。
ClassPathBeanDefinitionScanner:扫描类路径上的 @Component 注解类。
启动流程:
java
Copy Code
// 注册配置类
this.register(componentClasses);
// 刷新上下文
this.refresh();
refresh() 方法触发 Bean 定义注册、实例化和依赖注入。
3. 使用场景
独立应用:在 Java 应用中启动 Spring 容器。
测试环境:单元测试中创建轻量级上下文。
替代 XML:简化配置,避免 XML 文件。
4. 关键特性
立即加载:与 ClassPathXmlApplicationContext 类似,配置文件读取后立即创建 Bean。
注解驱动:通过 @Configuration 和 @Bean 注解定义 Bean。
生命周期管理:处理 Bean 的初始化和销毁。
5. 对比其他上下文
ClassPathXmlApplicationContext:基于 XML 配置。
FileSystemXmlApplicationContext:支持文件系统路径。
总结:AnnotationConfigApplicationContext 是 Spring 的核心容器实现,通过注解驱动简化配置管理,适用于现代 Java 应用。
常用方法
AnnotationConfigApplicationContext 常用方法详解
1. 核心初始化方法
构造方法
java
Copy Code
// 通过配置类初始化
new AnnotationConfigApplicationContext(ConfigClass.class);
参数:支持单个或多个配置类(Class<?>... componentClasses)。
作用:解析 @Configuration 类中的 @Bean 方法和 @Component 注解类。
refresh()
java
Copy Code
context.refresh();
作用:完成 Bean 定义注册、实例化和依赖注入。
2. Bean 操作方法
获取 Bean
java
Copy Code
// 通过类型获取
MyBean bean = context.getBean(MyBean.class);
// 通过名称获取
MyBean bean = context.getBean("myBean", MyBean.class);
特性:
getBean(Class<T> type):自动类型转换。
getBean(String name):需手动类型转换。
检查 Bean 存在性
java
Copy Code
boolean exists = context.containsBean("myBean");
3. 配置管理方法
注册配置类
java
Copy Code
context.register(ConfigClass.class);
作用:动态添加配置类,需配合 refresh() 生效。
获取配置属性
java
Copy Code
String value = context.getEnvironment().getProperty("my.key");
4. 生命周期管理
关闭上下文
java
Copy Code
context.close();
作用:销毁所有 Bean,释放资源。
5. 扩展功能
扫描包路径
java
Copy Code
context.scan("com.example.package");
作用:自动扫描指定包路径下的 @Component 类。
注册 BeanPostProcessor
java
Copy Code
context.addBeanFactoryPostProcessor(new MyPostProcessor());
作用:在 Bean 实例化前执行自定义逻辑。
总结:AnnotationConfigApplicationContext 提供了从初始化到 Bean 操作的完整生命周期管理方法,适用于基于注解的 Spring 配置场景。
与SpringUtil.getBean的关系
SpringUtil.getBean 与 AnnotationConfigApplicationContext 的关系
1. 核心功能对比
SpringUtil.getBean
作用:通过静态方法获取 Spring 容器中的 Bean 实例。
实现:依赖 ApplicationContext 实例(如 AnnotationConfigApplicationContext)。
场景:简化 Bean 获取,避免手动管理上下文。
AnnotationConfigApplicationContext
作用:基于注解配置的 Spring 应用上下文,负责 Bean 的注册、实例化和依赖注入。
实现:通过 @Configuration 类解析 @Bean 方法和 @Component 注解类。
场景:初始化 Spring 容器,管理应用生命周期。
2. 技术实现
SpringUtil.getBean
java
Copy Code
public class SpringUtil {
private static ApplicationContext context;
public static <T> T getBean(Class<T> clazz) {
return context.getBean(clazz);
}
}
依赖:需手动注入 ApplicationContext 实例(如 AnnotationConfigApplicationContext)。
调用链:SpringUtil.getBean → ApplicationContext.getBean → Bean 实例。
AnnotationConfigApplicationContext 初始化
java
Copy Code
// 创建上下文
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// 注入到 SpringUtil
SpringUtil.setContext(context);
关键步骤:
实例化 AnnotationConfigApplicationContext。
通过 refresh() 方法加载 Bean 定义。
将上下文注入 SpringUtil。
3. 生命周期管理
初始化顺序
AnnotationConfigApplicationContext:
步骤:
new AnnotationConfigApplicationContext(AppConfig.class)
context.refresh()
作用:完成 Bean 注册和实例化。
SpringUtil 注入:
时机:容器初始化后,将上下文注入 SpringUtil。
代码示例:
java
Copy Code
// 初始化上下文
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
context.refresh();
// 注入到工具类
SpringUtil.setContext(context);
4. 使用场景
SpringUtil.getBean
适用场景:
业务代码中便捷获取 Bean(如 SpringUtil.getBean(MyService.class))。
避免手动管理上下文实例。
AnnotationConfigApplicationContext
适用场景:
应用启动时初始化 Spring 容器(如 Spring Boot 的 SpringApplication.run())。
需自定义配置时(如扫描特定包、注册 BeanPostProcessor)。
5. 注意事项
线程安全:
SpringUtil 需确保上下文单例且线程安全(如使用 ThreadLocal)。
配置管理:
AnnotationConfigApplicationContext 支持 @ConfigurationProperties 等高级特性。
替代方案:
Spring Boot 自动注入 ApplicationContext,无需手动管理工具类。
总结:SpringUtil.getBean 是 AnnotationConfigApplicationContext 的应用层封装,通过静态方法简化 Bean 获取,而 AnnotationConfigApplicationContext 负责底层容器的初始化和管理。两者需配合使用,确保上下文正确注入。
和ApplicationContext 的差别
AnnotationConfigApplicationContext 与 ApplicationContext 的核心区别
1. 配置方式
AnnotationConfigApplicationContext
特点:基于注解配置(如 @Configuration 和 @Bean),无需 XML 文件。
使用场景:现代 Spring 应用(如 Spring Boot)的首选配置方式。
ApplicationContext
特点:抽象接口,支持多种配置方式(XML、注解、Java 配置)。
实现类:
ClassPathXmlApplicationContext:基于 XML 配置。
AnnotationConfigApplicationContext:基于注解。
2. 功能扩展
AnnotationConfigApplicationContext
核心接口:继承 ConfigurableApplicationContext,支持事件监听、BeanFactoryPostProcessor 等高级功能。
ApplicationContext
基础功能:继承 BeanFactory,提供国际化、资源加载、环境配置等扩展。
3. 初始化机制
AnnotationConfigApplicationContext
加载策略:立即加载配置类(如 refresh() 方法触发 Bean 注册和实例化)。
ApplicationContext
加载策略:支持延迟加载(如 BeanFactory)和立即加载(如 ClassPathXmlApplicationContext)。
4. 使用场景
AnnotationConfigApplicationContext
适用场景:
纯注解驱动的应用(如 Spring Boot 启动类)。
需动态注册配置类的场景(如测试环境)。
ApplicationContext
适用场景:
通用 Spring 容器管理(如 Spring MVC 配置)。
需兼容多种配置源的应用(如混合 XML/注解)。
总结:AnnotationConfigApplicationContext 是 ApplicationContext 的注解实现,通过 @Configuration 注解简化配置管理,而 ApplicationContext 是 Spring 容器的抽象接口,支持多种配置方式和高级功能。
知识总结
AnnotationConfigApplicationContext 知识体系总结
1. 核心功能与定位
作用:基于注解配置的 Spring 应用上下文,替代 XML 配置(如 @Configuration 和 @Bean)。
继承关系:
继承 AbstractApplicationContext,实现 ApplicationContext 接口。
包含 BeanFactory(如 DefaultListableBeanFactory)。
2. 初始化流程
构造方法:
无参构造:初始化 AnnotatedBeanDefinitionReader 和 ClassPathBeanDefinitionScanner。
参数构造:自动注册配置类并调用 refresh()。
关键步骤:
register():注册配置类(如 @Configuration)。
refresh():加载 Bean 定义、实例化和依赖注入。
3. 核心组件
BeanDefinitionReader:解析 @Bean 方法。
BeanDefinitionScanner:扫描 @Component 及其派生注解类。
BeanFactory:管理 Bean 生命周期(如单例、原型)。
4. 扩展功能
动态配置:支持 @RefreshScope 实现配置热更新。
BeanPostProcessor:自定义 Bean 实例化逻辑。
事件机制:集成 ApplicationEventMulticaster。
5. 使用场景
Spring Boot:自动配置核心实现(如 SpringApplication.run())。
测试环境:单元测试中创建轻量级上下文。
替代 XML:简化配置,避免 XML 文件。
总结:AnnotationConfigApplicationContext 是 Spring 的注解驱动容器,通过 Java 代码简化配置管理,支持动态更新和高级功能。
更多推荐

所有评论(0)