<beans>
<import resource="services.xml"/>
<import resource="resources/messageSource.xml"/>
<import resource="/resources/themeSource.xml"/>
<bean id="bean1" class="..."/>
<bean id="bean2" class="..."/>
<alias name="fromName" alias="toName"/>
</beans>
它可与用于组合多个 XML 文件
配置形式如下:
其中 import的作用类似于java的import作用,是用于导入资源的
Alias 的作用是用于bean的别名
fromName表示在同一个容器中命名为fromName的bean,可以是上面配置中的bean1或者是bean2
toName表示fromName Bean的别名
Bean的配置
一个Spring IoC容器管理着一个或者多个bean, 你可以通过XML配置创建的Bean提供给容器, 如下表格式XML方式配置Bean的定义
Bean的命名
每个Bean有一个或多个的标示符, 这些标示符是唯一的, 基于XML配置的Bean, 可以通过id或者name属性来指定Bean的标示符的, 但是需要注意的是, id属性值在早些时候的版本是不可以包含特殊字符的(这里我采用的是Spring2.5.3版本来进行测试,发现这个版本id不支持特殊字符)
如果使用特殊的字符串会报如下类型的错误:
org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 10 in XML document from class path resource
[com/wenj/resources/beans.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1:
'hello;' is not a valid value for 'NCName'.
而最新版本(我现在学习的是Spring4.0.2.RELEASE)我测试的时候是没有这个错误的
我查了下文档,发现在早些时候的版本id的属性是定义为: xsd:ID类型的,而在之后的版本id的属性是定义为: xsd:string类型的. 所以这点在使用较早版本的Spring需要注意这一点
还有也可以不用Bean进行命名, 如果这样的话, 容器会自动的创建一个唯一的标识符给Bean
可以通过容器getBean(Class<T> requiredType)这个方法来获取
如:
BeanType bt = cxt.getBean(BeanType.class);
但是如果你想通过名称来引用Bean, 也就是通过ref元素或者Service Locator来查找的话,那么必须给Bean命名, 如果真的不想用id或name属性的话, 那么可以采用内部Bean或者autowiring collaborators的方法
Bean的别名
可以通过之前示例的<alias />标签来实现
<alias name="fromName" alias="toName"/>
实例化Bean
以构造器来实例化一个Bean
1) 使用默认的空构造器来配置Bean
在xml可以这样配置
<bean id=”...” class=”......”/>
2) 使用有参构造器来配置Bean
例1:
package com.wenj.servicesimpl;
public class C {
public C(A a, B b){
//...
}
}
在xml中可以这样配置
<bean id="a" class="com.wenj.servicesimpl.A"/>
<bean id="b" class="com.wenj.servicesimpl.B"/>
<bean id="c" class="com.wenj.servicesimpl.C">
<constructor-arg ref="a"/>
<constructor-arg ref="b"/>
</bean>
例2:
package com.wenj.servicesimpl;
public class C {
private int age;
private String name;
public C(int age, String name){
this.age = age;
this.name = name;
System.out.println(age + ", " + name);
}
}
在xml中可以通过类型匹配来配置
<bean id="c2" class="com.wenj.servicesimpl.C">
<constructor-arg type="int" value="110"/>
<constructor-arg type="String" value="Name"/>
</bean>
也可以通过构造器的参数Index(从0~开始)来配置
<bean id="c2" class="com.wenj.servicesimpl.C">
<constructor-arg index="0" value="110"/>
<constructor-arg index="1" value="Name"/>
</bean>
也可以通过构造器的参数名来配置
<bean id="c2" class="com.wenj.servicesimpl.C">
<constructor-arg name="age" value="110"/>
<constructor-arg name="name" value="Name"/>
</bean>
以静态工厂方法实例化Bean
例 1:
package com.wenj.servicesimpl;
public class C {
private static C c = new C();
public C(){
System.out.println("C");
}
public static C createCInstance(){
return c;
}
}
在xml中可以这样配置:
<bean id="c3" class="com.wenj.servicesimpl.C" factory-method="createCInstance"/>
以工厂方法实例化Bean
例1:
package com.wenj.servicesimpl;
public class C {
public C(){
System.out.println("C");
}
}
//factory
package com.wenj.servicesimpl;
public class CFactory {
private static C c = new C();
public C createCInstance(){
return c;
}
}
在xml中可以这样配置
<bean id="cFactory" class="com.wenj.servicesimpl.CFactory"/>
<bean id="c4" factory-bean="cFactory" factory-method="createCInstance"/>
注意: 工厂类也可以处理多个对象, 持有多个不同对象的工厂方法
以setter的方式实例化Bean
基于setter的DI是由容器在调用完默认构造方法或者静态工厂方法后调用setter方法来实例化Bean
例 1:
package com.wenj.servicesimpl;
public class C {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在xml可以这样配置:
<bean id="c5" class="com.wenj.servicesimpl.C">
<property name="age" value="110"/>
<property name="name" value="username"/>
</bean>