Spring中bean的基本xml配置

有状态的bean ,需设置 <bean .......singleton="false"></bean>
**********

spring 容器内拼凑 bean 叫作装配。装配 bean 的时候,你是在告诉容器,需要哪些 bean ,以及容器如何使用依赖注入将它们配合在一起。
理论上, bean 装配可以从任何资源获得,包括属性文件,关系数据库等,但 xml 是最常见的 spring 应用系统配置源。 Spring 中的几种容器都支持使用 xml 装配 bean ,包括:
XmlBeanFactory

ClassPathXmlApplicationContext

FileSystemXmlApplicationContext

XmlWebApplicationContext

基本的 xml 配置包括如下几个方面:

1
.添加一个 bean
2
.设置 bean 的属性
2.1
手动设置
2.1.1
通过 Setter 方法
2.1.2
通过构造器
2.2
自动设置
其中 bean 的属性即为 bean 里的成员变量,这些成员变量值的获得可以通过 setter 方法,例如某个属性为 name, setter 方法为 setName(String name) ;或者通过构造器在类被实例化时初始化。 Setter 方法 ( 例如 setName 方法 ) 或者构造器的调用都可以通过在 xml 文件里进行配置,从而实现让 spring 容器来自动进行。

1 .添加一个 bean
以下是一个例子:
<bean
id = “mybean”
Class = “blog.spring.MyBean”
Singleton = “false”
init-method = “initMethod”
destroy-method = “destroyMethod”
autowire = “autowire type”
/>
下面是对该标签里各个属性的解释:
Id :
标识该 bean 的名称,通过 factory.getBean(“id”) 来获得实例。
Class :
bean 的类路径。
Singleton :
默认为 true ,即单实例模式,每次 getBean(“id”) 时获取的都是同
一个实例,如果设置为 false ,即原型模式,则每次获取的是新创建
的实例。
Init-method :
bean 实例化后要调用的方法 (bean 里定义好的方法 )
Destroy-method : bean
从容器里删除之前要调用的方法。
Autowire :
其属性要通过何种方法进行属性的自动装配。
对于上述的各个属性, id class 是必要的,其他的则可以省略。例如如果设置了 autowire 的值,则表明需要自动装配,否则是手动装配。

2 .通过 Setter 方法手动设置 bean 里的属性
Bean
里的属性通过 <property> 标签来标识。有以下几种情况:
简单类型属性
<bean id = “mybean” class = “blog.spring.MyBean”>
<property name = “name”>
<value>springTest</value>
</property>
</bean>
引用其他 bean
<bean id = “mybean” class = “blog.spring.MyBean” />
<bean id = “mybean1” class = “blog.spring.MyBean1”>
<property name = “name”>
<ref bean = “mybean” />
</property>
</bean>
也可以将 <ref> 改为
<bean class = “..”>
这样叫做内部 bean ,缺点是无法在其他地方重用这个 bean 的实例。
装配集合
共有以下几种集合的装配:
****
装配 List 和数组 ****
<property name = ”nameList”>
<list>
<value>something</value>
<ref bean = “blog.spring.MyBean” />
<value>otherThing</value>
</list>
</property>
****
装配 Set****
<property name = ”nameList”>
<set>
<value>something</value>
<ref bean = “blog.spring.MyBean” />
<value>otherThing</value>
</set>
</property>
****
装配 Map****
<property name = ”nameList”>
<map>
<entry key = “key1”>
<value>value1</value>
</entry>
<entry key = “key2”>
<ref bean = “mybean” />
</entry>
</map>
</property>
****
装配 Properties****
<property name = ”nameList”>
<props>
<prop key = “prop1”>value1</prop>
<prop key = “prop2”>value2</prop>
</props>
</property>
设置 null
要将一个属性 null ,需要通过 <null /> 标签,如果不设置,则属性为默认值 ( 在实例化时 ) 而不是 null
<property name=”name”> <null /> </property>

3 .通过构造器手动设置 bean 里的属性
假设有如下一个 bean
Public class MyBean {
Public MyBean( String arg1, MyBean1 arg2, String arg3 )
}
则可以在 xml 里这样配置该 bean
<bean id = “mybean” class = “blog.spring.MyBean”>
<constructor-arg index = “1”>
<value>springTest</value>
<constructor-arg>
<constructor-arg index = “0”>
<ref bean = “mybean1” />
<constructor-arg>
</bean>
其中的 index 是用来标识该参数在构造函数里的位置的,并从 0 开始。

4 .让 spring 完成自动装配
例如:
<bean
id = “mybean”
class = “blog.spring.MyBean”
autowire = “autowire type”
/>
下面是几种 autowire type 的说明:
● byname :
试图在容器中寻找和需要自动装配的属性名相同的 bean id ,如果没有找到相应的 bean ,则这个属性未被装配上。
● byType :
试图在容器中寻找一个与需要自动装配的属性类型相同的 bean id ,如果没有找到,则该属性未被装配上。
● constructor :
试图在容器中寻找与需要自动装配的 bean 的构造函数参数一致的一个或多个 bean ,如果没找到则抛出异常。
● autodetect :
首先尝试使用 constructor 来自动装配,然后再使用 byType 方式。
从上面可以看出,如果某个 bean 不手动设置 autowire 属性,则默认为手动装配。如果需要将所有 bean 都设置为自动装配时,可以通过在 <beans> 标签中设置 default-autowire 属性。 <beans> 标签是整个 xml 文档的根,在它下面就是一个个的 <bean>
其中 default-autowire 的值也有 byName byType constructor autodetect 四种。
例如配置如下:
<beans default-autowire = “byName”>
...
</beans>

自动装配可能带来不确定性问题。例如使用 byType 时可能同时发现两个相同的类型,则不知道该采用哪一个。所以可能混合采用自动和手动装配。例如,对某个 bean 设置为自动装配,而对其某个属性则手动明确的设置其值,例如:
<bean id = “mybean” class = “blog.spring.MyBean”
Autowire = “byType”
>
<property name = “name”>
<ref bean = “myBean1”>
</property>
</bean>
通过这样的配置,对 mybean 里的 name 属性进行手动装配,而对除 name 外的其他属性就进行自动装配。

好贴:http://bbs.bccn.net/thread-83040-1-1.html

posted on 2009-04-12 23:05 luofeng225 阅读(918) 评论(0)  编辑  收藏 所属分类: Spring


只有注册用户登录后才能发表评论。


网站导航:
 
<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

导航

统计

公告

我曾经听到这么一个故事: 一个年轻的程序员问一个老程序员(一个比较牛逼的公司的CTO) 年轻程序员: 你为什么这么牛X., 就好像没有你不会的。老程序员: 积累的。年轻程序员: 怎么才能积累到您的程度呢。我每天都在积累。但是似乎都没有感觉到进步。老程序员: 我从20岁开始做到了一件事情,直到今天,而且尽可能地保证不间断。年轻程序员: 到底是什么? 老程序员: 我每天保证自己有2个小时在学习新的东西。

常用链接

留言簿(3)

随笔分类

随笔档案

文章分类

相册

收藏夹

Java Website

java技术博客

搜索

最新评论

阅读排行榜

评论排行榜