1.ApplicationContext
ApplicationContext的实现类,如下图
-
ClassPathXmlApplicationContext:加载类路径下 Spring 的配置文件
-
FileSystemXmlApplicationContext:加载本地磁盘下 Spring 的配置文件
ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。在BeanFactory中,很多功能需要以编程的方式实现,而在ApplicationContext中则可以通过配置实现。
ApplicationContext:是IOC容器另一个重要接口, 它继承了BeanFactory的基本功能, 同时也继承了容器的高级功能,如:MessageSource(国际化资源接口)、ResourceLoader(资源加载接口)、ApplicationEventPublisher(应用事件发布接口)等。
基本代码:
public static void main(String[] args) {
// 创建ApplicationContext并加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// 获取Bean
HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorld");
// 使用Bean
helloWorld.printMessage();
}
2.BeanFactory
spring中工厂的类结构图:
BeanFactory 是Spring框架的最基本容器,它提供了一种延迟初始化Bean的机制。这意味着只有在需要时,Bean才会被实例化。BeanFactory 的主要职责是:
- 加载Bean的配置信息。
- 实例化Bean。
- 维护Bean的生命周期。
- 注入Bean之间的依赖关系。
基本代码:
public static void main(String[] args) {
// 创建BeanFactory并加载配置文件
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
// 获取Bean
HelloWorld helloWorld = (HelloWorld) factory.getBean("helloWorld");
// 使用Bean
helloWorld.printMessage();
}
3. 二者区别
- 延迟加载 vs. 预先加载: BeanFactory 采用延迟加载策略,只有在需要时才会实例化Bean。而 ApplicationContext 在容器启动时就会实例化所有的Bean。
- 功能扩展: ApplicationContext 提供了更多的企业级功能,如国际化、事件传播、资源加载等。它是BeanFactory 的一个扩展版本,适用于更复杂的应用程序。
- 性能: 由于 ApplicationContext 预先实例化所有的Bean,因此在启动时可能会有一些性能开销。相比之下,BeanFactory 的性能可能更好,因为它只在需要时才实例化Bean。
- 使用场景: 如果您的应用程序较小且对性能要求较高,可以使用BeanFactory。如果您需要更多的企业级功能或希望在启动时立即初始化Bean,可以使用ApplicationContext。
代码展示:
ApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = ac.getBean("Service", UserService.class);
System.out.println("Spring IOC容器创建好了");
BeanFactory beanFactory1= new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
beanFactory1.getBean("Service",UserService.class);
System.out.println("第二个Spring IOC容器创建好了");
BeanFactory beanFactory2= new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
System.out.println("第三个Spring IOC容器创建好了");