• 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配置为顶级元素内的元素。下面的示例显示了基于XML的配置元数据的基本结构:
     

    1. "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. bean>
    8. <bean id="..." class="...">
    9. bean>
    10. beans>
    11. ① id属性是标识单个bean定义的字符串。
    12. ② class属性定义bean的类型,并使用完全限定的类名。

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

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

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

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

    1. "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="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
    7. <property name="accountDao" ref="accountDao"/>
    8. <property name="itemDao" ref="itemDao"/>
    9. bean>
    10. beans>

    二、使用容器

    ApplicationContext是高级工厂的接口,能够维护不同bean及其依赖项的注册表。通过使用方法T getBean(String name,ClassrequiredType),您可以检索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的依赖性。

  • 相关阅读:
    温敏AIE双亲多肽分子/AIE磁性荧光微球/多重刺激响应性聚合物纳米微球相关制备
    文件高效批量重命名,轻松重命名不同类型的文件名并隐藏编号
    两个有助于理解Common Lisp宏的例子
    【数据结构与算法】第一篇:栈,队列
    操作系统:系统调用
    UDP协议
    一篇五分生信临床模型预测文章代码复现——Figure 2. 生存分析,箱线图表达改变分析(二)
    《Go题库·16》读写锁底层是怎么实现的
    MySQL数据库-备份
    力扣labuladong——一刷day45
  • 原文地址:https://blog.csdn.net/leesinbad/article/details/141038722