Spring中BeanFactory支持两个对象模型
<!--[if !supportLists]--> <!--[endif]--> 单态: 模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton 是默认的也是最常用的对象模型。对于无状态 服务对象很理想。
<!--[if !supportLists]--> 原型: 模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适合。
实例:
1
<
beans
>
2
3 <!-- non-singleton examples -->
4 < bean id ="nonSingleton" class ="java.lang.String" singleton ="true" >
5 < constructor-arg >
6 < value > Value </ value >
7 </ constructor-arg >
8 </ bean >
9
10 </ beans >
11
12 singleton:指定此JavaBean是否采用单例(Singleton)模式,如果设为"true",则在BeanFactory作用范围内,只维护此JavaBean 的一个实例,代码通过BeanFactory 获得此JavaBean 实例的引用。反之,如果设为"false",则通过BeanFactory获取此Java Bean 实例时,BeanFactory每次都将创建一个新的实例返回。
2
3 <!-- non-singleton examples -->
4 < bean id ="nonSingleton" class ="java.lang.String" singleton ="true" >
5 < constructor-arg >
6 < value > Value </ value >
7 </ constructor-arg >
8 </ bean >
9
10 </ beans >
11
12 singleton:指定此JavaBean是否采用单例(Singleton)模式,如果设为"true",则在BeanFactory作用范围内,只维护此JavaBean 的一个实例,代码通过BeanFactory 获得此JavaBean 实例的引用。反之,如果设为"false",则通过BeanFactory获取此Java Bean 实例时,BeanFactory每次都将创建一个新的实例返回。
1
public
class
NonSingleton {
2
3 public static void main(String[] args) {
4
5 BeanFactory factory = new XmlBeanFactory( new FileSystemResource(
6 " build/beans.xml " ));
7
8 String s1 = (String)factory.getBean( " nonSingleton " );
9 String s2 = (String)factory.getBean( " nonSingleton " );
10 System.out.println( " Identity Equal?: " + (s1 == s2));
11 System.out.println( " Value Equal:? " + s1.equals(s2));
12 System.out.println(s1);
13 System.out.println(s2);
14 }
15 }
2
3 public static void main(String[] args) {
4
5 BeanFactory factory = new XmlBeanFactory( new FileSystemResource(
6 " build/beans.xml " ));
7
8 String s1 = (String)factory.getBean( " nonSingleton " );
9 String s2 = (String)factory.getBean( " nonSingleton " );
10 System.out.println( " Identity Equal?: " + (s1 == s2));
11 System.out.println( " Value Equal:? " + s1.equals(s2));
12 System.out.println(s1);
13 System.out.println(s2);
14 }
15 }
分析结果:
Identity Equal?: true
Value Equal:? true
Value
Value
由结果可以看出由fantory产生的bean对象只有一个。
注意: 在Spring中消除了由用户自己来实现Singleton模式的应用,Spring Bean的缺省行为就是Singleton,不必再为了Singleton编码。
另外一个例子:
这里还是以HelloBean为例,这三个文件都放在包javamxj.spring.basic.singleton下。
HelloBean.java
这里多加了属性i,用它得到随机数
package
javamxj
.
spring
.
basic
.
singleton
;
public class HelloBean { private String helloWorld; private int i = ( int) (100 * Math.random()); public HelloBean( String helloWorld) { this.helloWorld = helloWorld; } public void sayHello() { System.out.println(helloWorld); System.out.println( "输出随机整数: " + i); } } |
· 配置文件 bean.xml
在这个Beans中,定义了两个bean,都指向HelloBean类,主要不同就是第二个bean指明了singleton="false",即不采用singleton部署方式。
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="singletonBean" class="javamxj.spring.basic.singleton.HelloBean"> <constructor-arg> <value>Hello! 这是singletonBean!</value> </constructor-arg> </bean> <bean id="prototypeBean" class="javamxj.spring.basic.singleton.HelloBean" singleton="false"> <constructor-arg> <value>Hello! 这是prototypeBean! </value> </constructor-arg> </bean> </beans> |
· 测试程序:main.java
分别取得singletonBean和prototypeBean各两个实例,然后输出随机数,最后比较同一个bean的两个实例的引用是否相同。
package
javamxj
.
spring
.
basic
.
singleton
;
import org . springframework . beans . factory . BeanFactory ; import org . springframework . beans . factory . xml . XmlBeanFactory ; import org . springframework . core . io . ClassPathResource ; import org . springframework . core . io . Resource ; public class Main { public static void main( String[] args) { Resource res = new ClassPathResource( "javamxj/spring/basic/singleton/bean.xml"); BeanFactory factory = new XmlBeanFactory(res); HelloBean h1 = (HelloBean) factory.getBean( "singletonBean"); h1.sayHello(); HelloBean h2 = (HelloBean) factory.getBean( "singletonBean"); h2.sayHello(); System.out.println( "h1==h2: " + (h1==h2)); System.out.println( ""); HelloBean h3 = (HelloBean) factory.getBean( "prototypeBean"); h3.sayHello(); HelloBean h4 = (HelloBean) factory.getBean( "prototypeBean"); h4.sayHello(); System.out.println( "h3==h4: " + (h3==h4)); } } |
·运行,控制台输出:
Hello! 这是singletonBean!
输出随机整数: 7
Hello! 这是singletonBean!
输出随机整数: 7
h1==h2: true
输出随机整数: 7
Hello! 这是singletonBean!
输出随机整数: 7
h1==h2: true
Hello! 这是prototypeBean!
输出随机整数: 95
Hello! 这是prototypeBean!
输出随机整数: 60
h3==h4: false
输出随机整数: 95
Hello! 这是prototypeBean!
输出随机整数: 60
h3==h4: false