当前位置:   article > 正文

Spring ApplicationContext 容器

Spring ApplicationContext 容器

一、概述

Application Context 是 BeanFactory 的子接口,也被称为 Spring 上下文。

Application Context 是 spring 中较高级的容器。和 BeanFactory 类似负责实例化、配置和组装bean,将所有的 bean 集中在一起,当有请求的时候分配 bean。 另外,它增加了企业所需要的功能,比如,从属性文件中解析文本信息和将事件传递给所指定的监听器。这个容器在 org.springframework.context.ApplicationContext interface 接口中定义。

ApplicationContext 包含 BeanFactory 所有的功能,一般情况下,相对于 BeanFactory,ApplicationContext 会更加优秀。当然,BeanFactory 仍可以在轻量级应用中使用,比如移动设备或者基于 applet 的应用程序。

最常被使用的 ApplicationContext 接口实现:

  • FileSystemXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你需要提供给构造器 XML 文件的完整路径。

  • ClassPathXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可,因为,容器会从 CLASSPATH 中搜索 bean 配置文件。

  • XmlWebApplicationContext:该容器会在一个 web 应用程序的范围内加载在 XML 文件中已被定义的 bean。

下图显示了Spring工作方式的高层视图。你的应用程序类与配置元数据相结合,这样,在 ApplicationContext 被创建和初始化后,你就有了一个完全配置好的可执行系统或应用程序。

container magic

 1、配置元数据

如上图所示,SpringIoc容器使用一种形式的配置元数据。该配置元数据表示作为应用程序开发者,您如何告诉Spring容器实例化、配置和组装应用程序中的组件。

Spring Ioc容器本身与该配置元数据的实际编写格式完全解耦。如今,许多开发人员为其Spring应用程序选择基于Java的配置:

  • 基于注释的配置:在应用程序的组件类上使用基于注解的配置元数据来定义bean。
  • 基于Java的配置:通过使用基于Java的组态类来定义应用程序类外部的bean。要使用这些功能,请参阅@Configuration、@Bean、@Import和@DependsOn注释。

Spring配置由容器必须管理的至少一个(通常是多个)bean定义组成。Java配置通常在@configuration类中使用@Bean注释的方法,每个方法对应于一个Bean定义。

这些bean定义对应于组成应用程序的实际对象。通常,您定义服务层对象、持久层对象(如存储库或数据访问对象(DAO))、表示对象(如Web控制器)、基础架构对象(如JPA EntityManagerFactory)、JMS队列等。通常,不在容器中配置细粒度域对象,因为创建和加载域对象通常是存储库和业务逻辑的责任。

XML作为外部配置DSL

基于XML的配置元数据将这些bean配置为顶级<beans/>元素内的<bean/>元素。下面的示例显示了基于XML的配置元数据的基本结构:
 

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. https://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <bean id="..." class="..."> ① ②
  7. <!-- collaborators and configuration for this bean go here -->
  8. </bean>
  9. <bean id="..." class="...">
  10. <!-- collaborators and configuration for this bean go here -->
  11. </bean>
  12. <!-- more bean definitions go here -->
  13. </beans>
  14. ① id属性是标识单个bean定义的字符串。
  15. ② class属性定义bean的类型,并使用完全限定的类名。

id属性的值可以用于引用协作对象。此示例中未显示用于引用协作对象的XML。有关详细信息,请参见依赖项。

对于实例化容器,需要将XML资源文件的位置路径提供给ClassPathXmlApplicationContext构造函数,该构造函数允许容器从各种外部资源(如本地文件系统、Java CLASSPATH等)加载配置元数据。

ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

以下示例显示服务层对象(services.xml)配置文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. https://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <!-- services -->
  7. <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
  8. <property name="accountDao" ref="accountDao"/>
  9. <property name="itemDao" ref="itemDao"/>
  10. <!-- additional collaborators and configuration for this bean go here -->
  11. </bean>
  12. <!-- more bean definitions for services go here -->
  13. </beans>

二、使用容器

ApplicationContext是高级工厂的接口,能够维护不同bean及其依赖项的注册表。通过使用方法T getBean(String name,Class<T>requiredType),您可以检索bean的实例。

ApplicationContext允许您读取bean定义并访问它们,如下例所示:

  1. // create and configure beans
  2. ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
  3. // retrieve configured instance
  4. PetStoreService service = context.getBean("petStore", PetStoreService.class);
  5. // use configured instance
  6. List<String> userList = service.getUsernameList();

在Groovy配置中,引导看起来非常相似。它有一个不同的上下文实现类,该类支持Groovy(但也理解XMLBean定义)。下面的示例显示Groovy配置:

ApplicationContext context = new GenericGroovyApplicationContext("services.groovy", "daos.groovy");

最灵活的变体是GenericApplicationContext与读取器委托相结合—例如,与XML文件的XmlBeanDefinitionReader相结合,如下例所示:

  1. GenericApplicationContext context = new GenericApplicationContext();
  2. new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml");
  3. context.refresh();

您还可以对Groovy文件使用GroovyBeanDefinitionReader,如下例所示:

  1. GenericApplicationContext context = new GenericApplicationContext();
  2. new GroovyBeanDefinitionReader(context).loadBeanDefinitions("services.groovy", "daos.groovy");
  3. context.refresh();

您可以在同一ApplicationContext上混合和匹配这样的读取器委托,从不同的配置源读取bean定义。

然后可以使用getBean来检索bean的实例。ApplicationContext接口有一些其他方法来检索bean,但理想情况下,应用程序代码永远不应该使用它们。实际上,您的应用程序代码应该根本没有对getBean()方法的调用,因此根本不依赖于SpringAPI。例如,Spring与web框架的集成为各种web框架组件(如控制器和JSF托管bean)提供了依赖注入,使您能够通过元数据(如自动连接注释)声明对特定bean的依赖性。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/960256
推荐阅读
相关标签
  

闽ICP备14008679号