一 基于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-2.0.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>
二 实例化容器:
Resource resource =new FileSystemResource("beans.xml"); BeanFactory factory=new XmlBeanFactory(resource);
Resource reource =new ClassPathResource("beans.xml"); BeanFactory factory=new XmlBeanFactory(resource);
ApplicationContext context=new ClassPathXmlApplicationContext (new String("applicationContext.xml","applicationContext-part2.xml"));
//of course,an applicationContext is just an beanFactory
BeanFactory factory=(BeanFactory)context;
三 组成基于XML配置的多种元数据:
两种方式:
[list]
(1) 将文件路径作为字符串数组传递给ApplicationContext构造器,如:
ClassPathXmlApplicationContext (new String("applicationContext.xml","applicationContext-part2.xml"));
(2)<import resource="..."/>方式
<beans>
<import resource="services.xml"/>
<import resource="resources/messageSource.xml"/>
<import resource="/resources/themeSource.xml"/>
<bean id="bean1" class="..."/>
<bean id="bean2" class="..."/>
</beans>
此处相对路径,斜杠可以忽略...
[/list]
四 多种bean:
在容器内部,这些bean定义由
BeanDefinition对象来表示,该定义将包含以下信息:
- 全限定类名:这通常就是已定义bean的实际实现类。如果通过调用static factory方法来实例化bean,而不是使用常规的构造器,那么类名称实际上就是工厂类的类名。
- bean行为的定义,即创建模式(prototype还是singleton)、自动装配模式、依赖检查模式、初始化以及销毁方法。这些定义将决定bean在容器中的行为用于创建
- bean实例的构造器参数及属性值。比如使用bean来定义连接池,可以通过属性或者构造参数指定连接数,以及连接池大小限制等。
- bean之间的关系,即协作 (或者称依赖)。
bean定义
[img]C:\Documents and Settings\Administrator\桌面\22.bmp[/img]
除了通过bean定义来描述要创建的指定bean的属性之外,某些BeanFactory的实现也允许 将那些非BeanFactory创建的、已有的用户对象注册到容器中,比如使用 DefaultListableBeanFactory的registerSingleton(..) 方法。不过大多数应用还是采用元数据定义为主。
BEAN的别名,两种方式:
<alias name="fromName" alias="toName"/>或
<bean id="bean2" alias="toName" class="..."/>
实例化BEAN
在极少数情况下,容器将调用类的静态工厂方法来创建bean实例,
class属性将用来指定 实际具有静态工厂方法的类(至于调用静态工厂
方法创建的对象类型是当前class还是其他 的class则无关紧要)。
用构造器来实例化
<bean id="exampleBean" class="examples.ExampleBean"/>
<bean name="anotherExample" class="examples.ExampleBeanTwo"/>
给构造函数指定参数以及为bean实例设置属性将在随后的部份中谈及。
使用静态工厂方法实例化
<bean id="exampleBean"
class="examples.ExampleBean2"
factory-method="createInstance"/>
给工厂方法指定参数以及为bean实例设置属性将在随后的部份中谈
使用实例工厂方法实例化
<!-- the factory bean, which contains a method called createInstance() -->
<bean id="myFactoryBean" class="...">
...
</bean>
<!-- the bean to be created via the factory bean -->
<bean id="exampleBean"
factory-bean="myFactoryBean"
factory-method="createInstance"/>
使用容器
InputStream is = new FileInputStream("beans.xml");
BeanFactory factory = new XmlBeanFactory(is);
BeanFactory提供的方法极其简单。它仅提供了六种方法供客户代码调用:
[list=1]
- boolean containsBean(String):如果BeanFactory包含给定名
称的bean定义 (或bean实例),则返回true
- Object getBean(String):返回以给定名字注册的bean实例。
根据bean的配置情况,如果为singleton模式将返回一个共享的实例,否则
将返回一个新建的实例。如果没有找到指定的bean,该方法可能会抛出
BeansException异常(实际上将抛出NoSuchBeanDefinitionException
异常),在对bean进行实例化和预处理时也可能抛出异常
- Object getBean(String, Class):返回以给定名称注册的bean实例,
并转换为给定class类型的实例,如果转换失败,相应的异常 (BeanNotOfRequiredTypeException)将被抛出。上面
的getBean(String)方法也适用该规则。
- Class getType(String name):返回给定名称的bean的Class。
如果没有找到指定的bean实例,则抛出NoSuchBeanDefinitionException异常。
- boolean isSingleton(String):判断给定名称的bean定义
或bean实例)是否为singleton模式(singleton将在bean的作用域中讨论)
如果bean没找到,则抛出NoSuchBeanDefinitionException异常。
- String[] getAliases(String):返回给定bean名称的所有别名。