赞
踩
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 配置文件。
下图显示了Spring工作方式的高层视图。你的应用程序类与配置元数据相结合,这样,在 ApplicationContext
被创建和初始化后,你就有了一个完全配置好的可执行系统或应用程序。
如上图所示,SpringIoc容器使用一种形式的配置元数据。该配置元数据表示作为应用程序开发者,您如何告诉Spring容器实例化、配置和组装应用程序中的组件。
Spring Ioc容器本身与该配置元数据的实际编写格式完全解耦。如今,许多开发人员为其Spring应用程序选择基于Java的配置:
Spring配置由容器必须管理的至少一个(通常是多个)bean定义组成。Java配置通常在@configuration类中使用@Bean注释的方法,每个方法对应于一个Bean定义。
这些bean定义对应于组成应用程序的实际对象。通常,您定义服务层对象、持久层对象(如存储库或数据访问对象(DAO))、表示对象(如Web控制器)、基础架构对象(如JPA EntityManagerFactory)、JMS队列等。通常,不在容器中配置细粒度域对象,因为创建和加载域对象通常是存储库和业务逻辑的责任。
XML作为外部配置DSL
基于XML的配置元数据将这些bean配置为顶级<beans/>元素内的<bean/>元素。下面的示例显示了基于XML的配置元数据的基本结构:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- https://www.springframework.org/schema/beans/spring-beans.xsd">
-
- <bean id="..." class="..."> ① ②
- <!-- collaborators and configuration for this bean go here -->
- </bean>
-
- <bean id="..." class="...">
- <!-- collaborators and configuration for this bean go here -->
- </bean>
-
- <!-- more bean definitions go here -->
-
- </beans>
-
-
- ① id属性是标识单个bean定义的字符串。
-
- ② class属性定义bean的类型,并使用完全限定的类名。
id属性的值可以用于引用协作对象。此示例中未显示用于引用协作对象的XML。有关详细信息,请参见依赖项。
对于实例化容器,需要将XML资源文件的位置路径提供给ClassPathXmlApplicationContext构造函数,该构造函数允许容器从各种外部资源(如本地文件系统、Java CLASSPATH等)加载配置元数据。
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
以下示例显示服务层对象(services.xml)配置文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- https://www.springframework.org/schema/beans/spring-beans.xsd">
-
- <!-- services -->
-
- <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
- <property name="accountDao" ref="accountDao"/>
- <property name="itemDao" ref="itemDao"/>
- <!-- additional collaborators and configuration for this bean go here -->
- </bean>
-
- <!-- more bean definitions for services go here -->
-
- </beans>
ApplicationContext是高级工厂的接口,能够维护不同bean及其依赖项的注册表。通过使用方法T getBean(String name,Class<T>requiredType),您可以检索bean的实例。
ApplicationContext允许您读取bean定义并访问它们,如下例所示:
- // create and configure beans
- ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
-
- // retrieve configured instance
- PetStoreService service = context.getBean("petStore", PetStoreService.class);
-
- // use configured instance
- List<String> userList = service.getUsernameList();
在Groovy配置中,引导看起来非常相似。它有一个不同的上下文实现类,该类支持Groovy(但也理解XMLBean定义)。下面的示例显示Groovy配置:
ApplicationContext context = new GenericGroovyApplicationContext("services.groovy", "daos.groovy");
最灵活的变体是GenericApplicationContext与读取器委托相结合—例如,与XML文件的XmlBeanDefinitionReader相结合,如下例所示:
- GenericApplicationContext context = new GenericApplicationContext();
- new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml");
- context.refresh();
您还可以对Groovy文件使用GroovyBeanDefinitionReader,如下例所示:
- GenericApplicationContext context = new GenericApplicationContext();
- new GroovyBeanDefinitionReader(context).loadBeanDefinitions("services.groovy", "daos.groovy");
- context.refresh();
您可以在同一ApplicationContext上混合和匹配这样的读取器委托,从不同的配置源读取bean定义。
然后可以使用getBean来检索bean的实例。ApplicationContext接口有一些其他方法来检索bean,但理想情况下,应用程序代码永远不应该使用它们。实际上,您的应用程序代码应该根本没有对getBean()方法的调用,因此根本不依赖于SpringAPI。例如,Spring与web框架的集成为各种web框架组件(如控制器和JSF托管bean)提供了依赖注入,使您能够通过元数据(如自动连接注释)声明对特定bean的依赖性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。