org.springframework.context.ApplicationContext
接口表示Spring IoC容器,负责实例化、配置和组装bean。容器经过读取配置元数据获取关于要实例化、配置和组装哪些对象的指令,配置元数据用XML、Java注解或Java代码表示,它容许你表达组成应用程序的对象以及这些对象之间丰富的相互依赖关系。html
Spring提供了ApplicationContext
接口的几个实现,在独立应用程序中,一般建立ClassPathXmlApplicationContext或FileSystemXmlApplicationContext的实例。虽然XML一直是定义配置元数据的传统格式,可是你能够经过提供少许XML配置来声明支持这些额外的元数据格式,从而指示容器使用Java注解或代码做为元数据格式。java
在大多数应用程序场景中,不须要显式用户代码来实例化Spring IoC容器的一个或多个实例。例如,在web应用程序场景中,在应用程序的web.xml文件中使用8行左右的简单样例web描述符XML就足够了(请参阅方便的web应用程序的ApplicationContext实例化)。若是使用Spring Tool Suite(一个Eclipse支持的开发环境),只需单击几下鼠标或按键,就能够轻松建立这个样板配置。web
下图显示了Spring如何工做的高级别视图,你的应用程序类与配置元数据相结合,这样,在建立并初始化ApplicationContext
以后,你就拥有了一个彻底配置的可执行系统或应用程序。spring
如上图所示,Spring IoC容器使用一种配置元数据形式,做为应用程序开发人员,此配置元数据表示如何告诉Spring容器在应用程序中实例化、配置和组装对象。sql
配置元数据一般以简单直观的XML格式提供,本章的大部份内容都使用这种格式来传达Spring IoC容器的关键概念和特性。segmentfault
基于XML的元数据不是唯一容许的配置元数据形式,Spring IoC容器自己与实际编写配置元数据的格式彻底解耦,如今,许多开发人员为他们的Spring应用程序选择基于java的配置。
有关在Spring容器中使用其余形式的元数据的信息,请参见:api
Spring配置包含容器必须管理的至少一个bean定义,而且一般包含多个bean定义,基于XML的配置元数据将这些bean配置为顶级<beans/>
元素中的<bean/>
元素,Java配置一般在@Configuration
类中使用@Bean
注解的方法。session
这些bean定义对应于组成应用程序的实际对象,一般,你定义服务层对象、数据访问对象(DAO)、表示对象(如Struts Action
实例)、基础设施对象(如Hibernate SessionFactories
)、JMS Queues
等等。一般,不会在容器中配置细粒度域对象,由于一般由DAO和业务逻辑负责建立和加载域对象。不过,你可使用Spring与AspectJ的集成来配置在IoC容器控制以外建立的对象。框架
下面的例子展现了基于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,有关更多信息,请参见依赖关系。
提供给ApplicationContext
构造函数的位置路径或路径是资源字符串,容许容器从各类外部资源(如本地文件系统、Java CLASSPATH
等)加载配置元数据。
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
在了解了Spring的IoC容器以后,你可能想了解更多关于Spring的Resource
抽象的信息,它提供了一种方便的机制,能够从URI语法中定义的位置读取InputStream
,特别是,Resource
路径用于构造应用程序上下文。
下面的示例显示了服务层对象(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>
下面的例子展现了数据访问对象daos.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="accountDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao"> <!-- additional collaborators and configuration for this bean go here --> </bean> <bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao"> <!-- additional collaborators and configuration for this bean go here --> </bean> <!-- more bean definitions for data access objects go here --> </beans>
在前面的示例中,服务层由PetStoreServiceImpl
类和两个数据访问对象JpaAccountDao
和JpaItemDao
类型(基于JPA对象关系映射标准)组成,property name
元素引用JavaBean属性的名称,ref
元素引用另外一个bean定义的名称。id
和ref
元素之间的这种连接表示协做对象之间的依赖关系,有关配置对象依赖关系的详细信息,请参见依赖关系。
让bean定义跨多个XML文件是颇有用的,一般,每一个单独的XML配置文件表示体系结构中的逻辑层或模块。
你可使用应用程序上下文构造函数从全部这些XML片断加载bean定义,这个构造函数接受多个Resource
位置,如前一节所示。或者,使用一个或多个<import/>
元素从另外一个或多个文件加载bean定义,下面的例子说明了如何作到这一点:
<beans> <import resource="services.xml"/> <import resource="resources/messageSource.xml"/> <import resource="/resources/themeSource.xml"/> <bean id="bean1" class="..."/> <bean id="bean2" class="..."/> </beans>
在前面的示例中,外部bean定义从三个文件加载:services.xml
、messageSource.xml
和themeSource.xml
,全部位置路径都相对于执行导入的定义文件,所以services.xml
必须与执行导入的文件位于相同的目录或类路径位置,而messageSource.xml
和themeSource.xml
必须位于导入文件位置下方的resources
位置。能够看到,前面的斜杠被忽略了,可是,因为这些路径是相对的,因此最好不要使用斜杠,根据Spring Schema,导入的文件的内容,包括顶层<beans/>
元素,必须是有效的XML bean定义。
它是可能的,但不推荐,在父目录中引用文件使用一个相对"../
“路径,这样作会建立对当前应用程序外部文件的依赖。特别地,这个引用不推荐用于classpath
:url(例如,classpath:../services.xml
),其中运行时解析过程选择“最近的”类路径根,而后查看其父目录,类路径配置更改可能致使选择不一样的、不正确的目录。你老是可使用彻底限定的资源位置,而不是相对路径:例如,
file:C:/config/services.xml
或classpath:/config/services.xml
,可是,请注意,你正在将应用程序的配置耦合到特定的绝对位置。一般更可取的作法是为这些绝对位置保留一个间接的位置 — 例如,经过“${…}
”占位符,这些占位符在运行时对JVM系统属性解析。
名称空间自己提供导入指令特性,除了普通bean定义以外,Spring提供的XML名称空间的选择还提供了其余配置特性 — 例如context
和util
名称空间。
做为外部化配置元数据的另外一个示例,bean定义也能够用Spring的Groovy Bean Definition DSL表示,Grails框架中有这样的定义,一般,这种配置存在于“.groovy
”文件中,其结构以下例所示:
beans { dataSource(BasicDataSource) { driverClassName = "org.hsqldb.jdbcDriver" url = "jdbc:hsqldb:mem:grailsDB" username = "sa" password = "" settings = [mynew:"setting"] } sessionFactory(SessionFactory) { dataSource = dataSource } myService(MyService) { nestedBean = { AnotherBean bean -> dataSource = dataSource } } }
这种配置风格在很大程度上等同于XML bean定义,甚至支持Spring的XML配置名称空间,它还容许经过importBeans
指令导入XML bean定义文件。
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(但也理解XML bean定义),下面的示例显示了Groovy配置:
ApplicationContext context = new GenericGroovyApplicationContext("services.groovy", "daos.groovy");
最灵活的变体是GenericApplicationContext
与reader委托相结合 — 例如,使用XmlBeanDefinitionReader
来处理XML文件,以下例所示:
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
上混合和匹配这样的reader委托,从不一样的配置源读取bean定义。
而后可使用getBean
检索bean的实例,ApplicationContext
接口还有一些用于检索bean的其余方法,但在理想状况下,应用程序代码不该该使用它们。实际上,你的应用程序代码应该彻底不调用getBean()
方法,所以彻底不依赖于Spring API。例如,Spring与web框架的集成为各类web框架组件(如控制器和JSF管理的bean)提供了依赖注入,容许你经过元数据(如自动装配注解)声明对特定bean的依赖。