在上一篇博文里我已经简单介绍了一些Beans
的基本配置。现在介绍Bean
的更为详细的相关内容。
Bean
的作用范围(Scope
)
在Spring
中,Bean
有5
种作用范围,分别是:
-singleton
,即单例模式,在整个环境中仅存在一个Bean
的实例对象。
-prototype
,可以无限次实例化,从某种程度上说,相当于java
的new
运算符。
-request
,每个Http Request
均拥有一个Bean
的实例。
-session
,每个会话均拥有一个Bean
的实例。
-global session
,全局session
。类似于session
,但是仅仅只能在基于Portlet
的Web
应用程序中使用。
在Spring
中,Bean
默认Scope
是Singleton
,若要手动指定Scope
,则应在配置文件中插入下面的代码:
<
bean
id
="accountService"
class
="com.foo.DefaultAccountService"
scope
="xxx"
/>
其中,scope
属性取值可为上面的5
个值中的任意一个。
需要注意的是,若要使用request
,session
或者global session
,则必须使用可以支持web
的ApplicationContext
的实现,比如XmlWebApplicationContext
,否则会出现IllegalStateException
异常。在web
程序里面,特别是要与Struts
框架相集成的情况下,应在web.xml
里面加入下面所示的监听类(要求Servlet
版本在2.4
以上,其余的版本请查阅相关文档)。
<
web-app
>
...
< listener >
< listener-class >
org.springframework.web.context.request.RequestContextListener
</ listener-class >
</ listener >
...
</ web-app >
...
< listener >
< listener-class >
org.springframework.web.context.request.RequestContextListener
</ listener-class >
</ listener >
...
</ web-app >
自定义Bean
的特性
对于Bean
,可以为其自定义初始化的回调方法和销毁回调方法。
方法很容易,只需在配置文件中加入下面所示的代码:
<
bean
id
="exampleInitBean"
class
="examples.ExampleBean"
init-method
="init"
/>
然后在
Bean
中定义如下的方法:
public
class ExampleBean {
public void init() {
// do some initialization work
}
}
public void init() {
// do some initialization work
}
}
对于销毁回调方法,也是一样的,在配置文件中定义
:
<
bean
id
="exampleInitBean"
class
="examples.ExampleBean"
destroy-method
="cleanup"
/>
然后在Bean
中定义一个cleanup()
方法即可。其实还有一种方法,即Bean
实现InitializingBean
和DisposableBean
接口,也可以达到这种目的。但是如果这么做会与Spring
发生耦合,不利于代码的可维护性。
有的时候可能存在许多Bean
,这些Bean
都需要调用初始化方法,要是在配置文件中逐个修改,是很费时间的事情,我们可以采用默认初始化方法。主要做如下配置:
<
beans
default-init-method
="init"
>
< bean id ="blogService" class ="com.foo.DefaultBlogService" >
< property name ="blogDao" ref ="blogDao" />
</ bean >
</ beans >
< bean id ="blogService" class ="com.foo.DefaultBlogService" >
< property name ="blogDao" ref ="blogDao" />
</ bean >
</ beans >
这段配置假设初始化方法均命名为init()
,一旦创建这个Bean
,则会调用所有与之存在依赖关系的Bean
的init()
。
本文转自 kevx 51CTO博客,原文链接:http://blog.51cto.com/spinlock/327794,如需转载请自行联系原作者