AnnotationConfigApplicationContext 介绍
AnnotationConfigApplicationContext
是 Spring 框架中的一个类,用于创建基于注解的 Spring 应用上下文。它继承自 AbstractApplicationContext
类,并实现了 ConfigurableApplicationContext
接口。
使用 AnnotationConfigApplicationContext
创建 Spring 应用上下文时,需要指定一个或多个配置类。,开发者可以直接在 Java 类中使用注解如 @Configuration
、@Bean
等来声明和配置 Bean。
AnnotationConfigApplicationContext
属于 Spring 的 Java 配置支持模块,用于以纯 Java 注解的方式来替代 XML 配置文件来创建和管理 Spring 容器上下文。
ApplicationContext的三种加载应用上下文的方式:
- AnnotationConfigApplicationContext
- ClassPathXmlApplicationContext
- FileSystemXmlApplicationContext
AnnotationConfigApplicationContext
属于其中的一种。
AnnotationConfigApplicationContext
构造方法
它有四种构造方法:
- public AnnotationConfigApplicationContext()
- public AnnotationConfigApplicationContext(DefaultListableBeanFactory beanFactory)
- public AnnotationConfigApplicationContext(Class<?>... componentClasses)
- public AnnotationConfigApplicationContext(String... basePackages)
public AnnotationConfigApplicationContext()
进行读取器和扫描器的初始化,在实例化前会调用父类的构造方法给BeanFactory赋值为DefaultListableBeanFactory。
此构造方法创建一个空的 AnnotationConfigApplicationContext 实例,不预先加载任何配置类或执行自动扫描。后续需要调用 register(Class<?>...) 方法手动注册配置类,或者调用 scan(String...) 方法指定要扫描的包路径以查找注解配置类。
示例代码
AnnotationConfigApplicationContext
是一个空的上下文,但是仍然可以通过 register()
方法手动注册配置类或基础包。Main
类中创建了一个 AnnotationConfigApplicationContext
对象,并通过 register()
方法手动注册了 AppConfig
配置类。这样,AppConfig
中的配置就会被应用到 Spring 应用上下文中。
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(AppConfig.class);
context.refresh();
// 获取 Bean 并使用
context.close();
}
}
public AnnotationConfigApplicationContext(DefaultListableBeanFactory beanFactory)
通过此构造方法,可以直接传递一组配置类作为参数,在创建上下文时就立即加载和解析这些配置类。配置类上通常会有 @Configuration 注解,里面包含了通过 @Bean 注解的方法定义的 Bean 定义。
示例代码
AnnotationConfigApplicationContext
接受了一个已存在的 DefaultListableBeanFactory
实例,但是仍然可以通过 register()
方法手动注册配置类或基础包。在下面的代码中,Main
类中创建了一个 DefaultListableBeanFactory
实例,并通过 AnnotationConfigApplicationContext
的构造方法将其传递给 Spring 应用上下文。然后,通过 register()
方法手动注册了 AppConfig
配置类。这样,AppConfig
中的配置就会被应用到 Spring 应用上下文中。
public class Main {
public static void main(String[] args) {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(beanFactory);
context.register(AppConfig.class);
context.refresh();
// 获取 Bean 并使用
context.close();
}
}
public AnnotationConfigApplicationContext(Class<?>... componentClasses)
此构造方法,可以直接传递一组配置类作为参数,在创建上下文时就立即加载和解析这些配置类。配置类上通常会有 @Configuration
注解,里面包含了通过 @Bean
注解的方法定义的 Bean 定义。
示例代码
@Configuration
public class AppConfig {
// 配置类代码
}
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// 获取 Bean 并使用
context.close();
}
}
public AnnotationConfigApplicationContext(String... basePackages)
这个构造方法接收一个字符串数组类型的参数 basePackages
,允许你在创建 AnnotationConfigApplicationContext
实例的同时指定一组基础包名。Spring 容器将会扫描这些包下的类,寻找那些标记了 @Component
、@Configuration
、@Service
、@Repository
、@Controller
等注解的类,并将它们自动注册为 Spring 容器管理的 Bean。
通过这种方式,你可以快速地启动一个基于注解的 Spring 容器,无需显式地注册每个配置类或组件类。当调用 refresh()
方法后,Spring 容器将在指定的基础包下进行类扫描,按照注解信息生成 Bean 定义,并进一步初始化和管理这些 Bean。
示例代码
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.yang.SpringTest.config1", "com.yang.SpringTest.config2");
// 获取 Bean 并使用
context.close();
}
}
AnnotationConfigApplicationContext
命周期
命周期包括以下几个阶段:
-
创建阶段:在创建
AnnotationConfigApplicationContext
对象时,会创建一个空的DefaultListableBeanFactory
实例,并将其作为 Spring 应用上下文的核心 Bean 工厂。 -
配置阶段:在配置阶段,可以通过
register()
方法手动注册配置类或基础包,也可以通过构造方法指定配置类或基础包。Spring 应用上下文会解析这些配置类或基础包,并将其中的配置应用到 Bean 工厂中。 -
初始化阶段:在初始化阶段,Spring 应用上下文会创建所有的 Bean,并将其注册到 Bean 工厂中。同时,Spring 应用上下文还会执行 Bean 的初始化操作,例如调用
@PostConstruct
注解的方法。 -
使用阶段:在 Spring 应用上下文初始化完成后,可以通过
getBean()
方法获取 Bean 并使用。 -
销毁阶段:在使用完 Spring 应用上下文后,可以通过
close()
方法关闭 Spring 应用上下文。在关闭 Spring 应用上下文时,Spring 应用上下文会执行 Bean 的销毁操作,例如调用@PreDestroy
注解的方法。