7.2.2 实例化容器
7.2.2 实例化容器
实例化Spring的IoC容器很简单。提供给ApplicationContext
构造方法的一个或多个路径是表示实际资源的字符串,通过路径容器能从各种外部资源(比如本地文件系统)、Java的CLASSPATH
等处加载配置元数据。
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
在了解了Spring的IoC容器之后,您可能想知道更多关于Spring的
Resource
抽象的知识,如第8章资源中所述,它提供了一个方便的机制用于从用URI语法定义的地址读取InputStream。尤其如第8.7节“应用程序上下文和资源路径”中所述,Resource
路径用于构建应用程序的上下文。
下面的例子展示了service层对象的配置文件(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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- services -->
<bean 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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean
class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<bean 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>
在前面的例子中,service层由PetStoreServiceImpl
类和两个数据访问对象组成,数据访问对象一个是JpaAccountDao
类类型,一个是JpaItemDao
类类型(基于JPA对象/关系映射标准)。property name
元素是指JavaBean属性的名称,ref
元素引用另一个bean定义的名字。id
和ref
元素之间的这种联系表示了协作对象之间的依赖关系。关于配置对象的依赖关系的细节,请参阅依赖。
编写基于XML的配置元数据
让bean定义跨越多个XML文件非常有用。通常,每个单独的XML配置文件代表架构中一个逻辑层或模块。
您可以使用应用程序上下文的构造方法从所有这些XML片段加载bean的定义。就像前面的小节展示的,该构造方法可以接受多个Resource
地址。或者,使用一个或多个<import/>
元素从其他文件中加载bean定义。例如:
<beans>
<import resource="services.xml"/>
<import resource="resources/messageSource.xml"/>
<import resource="/resources/themeSource.xml"/>
<bean class="..."/>
<bean class="..."/>
</beans>
在前面的例子中,外部的bean定义从三个文件中加载:services.xml
、messageSource.xml
和themeSource.xml
。导入它们的定义文件中使用的地址都是相对路径,所以services.xml
必须和导入它的文件在同一目录下或着在类路径中,而messageSource.xml
和themeSource.xml
必须在下一级的resources
目录中。正如您所看到的,开头的斜线被忽略掉了,但是考虑到这些路径都是相对的,所以最好根本不使用斜线。被导入文件的内容,包括顶层的<beans/>
元素,都必须是依据Spring Schema有效的bean定义XML。
使用相对的"../"路径来引用上层目录中的文件是可以的,但是不建议。这样做会创建对当前应用程序之外的文件的依赖。特别是,不建议对"classpath:"的URL(例如"classpath:../services.xml")这样引用,如果这样做的话运行时解析程序(resolution process)会选择“最近的”类路径——根目录,然后找到它的上层目录,类路径可能会被配置到错误的目录上。
您随时可以使用完全限定的资源地址而不是相对路径,例如:"file:C:/config/services.xml"或"classpath:/config/services.xml"。但是,请注意,您将应用程序耦合到了特定的绝对位置。最好对这种绝对路径使用间接的引用,例如通过"${…}"占位符解析运行时的JVM系统属性。
import指令是bean命名空间自身提供的一个功能。普通的bean定义以外的其他配置功能可以在选择Spring提供的XML命名空间中获得,例如,“context”和“util”命名空间。
Groovy Bean定义DSL
作为外部化配置元数据的另一个例子,bean的定义也可以在Spring的Groovy Bean定义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定义文件。