当定义一个Spring的<bean>,必须声明bean 作用域的选项。例如,要强制Spring需要产生一个新的bean实例,应该声明bean的scope属性为prototype。如果你希望Spring 每次都返回同一个bean实例,应该声明bean的作用域,方式类似属性是单例。
Spring框架支持以下五个作用域,其中三个只有当您使用Web感知的 ApplicationContext 可用。
| 范围 |
描述 |
| singleton |
This scopes the bean definition to a single instance per Spring IoC container (default). |
| prototype |
This scopes a single bean definition to have any number of object instances. |
| request |
This scopes a bean definition to an HTTP request. Only valid in the context of a web-aware Spring ApplicationContext. |
| session |
This scopes a bean definition to an HTTP session. Only valid in the context of a web-aware Spring ApplicationContext. |
| global-session |
This scopes a bean definition to a global HTTP session. Only valid in the context of a web-aware Spring ApplicationContext. |
本章将讨论前两个范围和其余三将讨论的时候,我们将讨论有关Web感知Spring的ApplicationContext。
singleton作用域:
如果范围设置为单例,Spring IoC容器创建了一个由该bean定义的对象只有一个实例。这个单一实例存储在这样的单例bean的高速缓存,以及所有后续请求和引用针对该bean返回缓存对象。
默认范围是始终单例,但是当你需要bean的一个实例,可以设置的范围属性单例在bean配置文件中,如下图所示:
<!-- A bean definition with singleton scope -->
<bean
id
=
"..."
class
=
"..."
scope
=
"singleton"
>
<!-- collaborators and configuration for this bean go here -->
</bean>
示例:
让我们使用Eclipse IDE,然后按照下面的步骤来创建一个Spring应用程序:
| 步骤 |
描述 |
| 1 |
Create a project with a name SpringExample and create a package com.yiibai under the src folder in the created project. |
| 2 |
Add required Spring libraries using Add External JARs option as explained in the Spring Hello World Example chapter. |
| 3 |
Create Java classes HelloWorld and MainApp under the com.yiibai package. |
| 4 |
Create Beans configuration file Beans.xml under the src folder. |
| 5 |
The final step is to create the content of all the Java files and Bean Configuration file and run the application as explained below. |
这里是HelloWorld.java 文件的内容:
package
com
.
yiibai
;
public
class
HelloWorld
{
private
String
message
;
public
void
setMessage
(
String
message
){
this
.
message
=
message
;
}
public
void
getMessage
(){
System
.
out
.
println
(
"Your Message : "
+
message
);
}
}
以下是MainApp.java文件的内容:
package
com
.
yiibai
;
import
org
.
springframework
.
context
.
ApplicationContext
;
import
org
.
springframework
.
context
.
support
.
ClassPathXmlApplicationContext
;
public
class
MainApp
{
public
static
void
main
(
String
[]
args
)
{
ApplicationContext
context
=
new
ClassPathXmlApplicationContext
(
"Beans.xml"
);
HelloWorld
objA
=
(
HelloWorld
)
context
.
getBean
(
"helloWorld"
);
objA
.
setMessage
(
"I'm object A"
);
objA
.
getMessage
();
HelloWorld
objB
=
(
HelloWorld
)
context
.
getBean
(
"helloWorld"
);
objB
.
getMessage
();
}
}
以下是需要singleton作用域配置文件beans.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-3.0.xsd"
>
<bean
id
=
"helloWorld"
class
=
"com.yiibai.HelloWorld"
scope
=
"singleton"
>
</bean>
</beans>
一旦创建源代码和bean配置文件来完成,运行应用程序。如果一切顺利,这将打印以下信息:
Your Message : I'm object A Your Message : I'm object A
原型作用域:
如果范围设置为原型,那么Spring IoC容器创建对象的新的bean实例为每个特定的bean发出请求时的时间。作为一项规则,使用prototype作用域为所有状态的bean类和singleton作用域为无状态的bean。
要定义一个原型作用域,可以设置的范围属性为原型的bean配置文件中,如下图所示:
<!-- A bean definition with singleton scope -->
<bean
id
=
"..."
class
=
"..."
scope
=
"prototype"
>
<!-- collaborators and configuration for this bean go here -->
</bean>
示例:
让我们在地方工作的Eclipse IDE,然后按照下面的步骤来创建一个Spring应用程序:
| 步骤 |
描述 |
| 1 |
Create a project with a name SpringExample and create a package com.yiibai under the src folder in the created project. |
| 2 |
Add required Spring libraries using Add External JARs option as explained in the Spring Hello World Example chapter. |
| 3 |
Create Java classes HelloWorld and MainApp under the com.yiibai package. |
| 4 |
Create Beans configuration file Beans.xml under the src folder. |
| 5 |
The final step is to create the content of all the Java files and Bean Configuration file and run the application as explained below. |
这里是HelloWorld.java 文件的内容:
package
com
.
yiibai
;
public
class
HelloWorld
{
private
String
message
;
public
void
setMessage
(
String
message
){
this
.
message
=
message
;
}
public
void
getMessage
(){
System
.
out
.
println
(
"Your Message : "
+
message
);
}
}
以下是MainApp.java文件的内容:
package
com
.
yiibai
;
import
org
.
springframework
.
context
.
ApplicationContext
;
import
org
.
springframework
.
context
.
support
.
ClassPathXmlApplicationContext
;
public
class
MainApp
{
public
static
void
main
(
String
[]
args
)
{
ApplicationContext
context
=
new
ClassPathXmlApplicationContext
(
"Beans.xml"
);
HelloWorld
objA
=
(
HelloWorld
)
context
.
getBean
(
"helloWorld"
);
objA
.
setMessage
(
"I'm object A"
);
objA
.
getMessage
();
HelloWorld
objB
=
(
HelloWorld
)
context
.
getBean
(
"helloWorld"
);
objB
.
getMessage
();
}
}
以下是必需的原型作用域的配置文件beans.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-3.0.xsd"
>
<bean
id
=
"helloWorld"
class
=
"com.yiibai.HelloWorld"
scope
=
"prototype"
>
</bean>
</beans>
创建源代码和bean配置文件完成后,让我们运行应用程序。如果一切顺利,这将打印以下信息:
Your Message : I'm object A Your Message : null
原文发布时间为:2018-10-14