Spring核心技术之Bean的作用域
本文内容纲要:Spring核心技术之Bean的作用域
在spring中bean的作用域是spring容器用来返回调用者实例类型的
在spring中有5中类型的作用域:
先来比较一下singeton 和 prototype:
package springapp.test;/**
* @author zhangxuegang
* @version 1.0
* @created 2012-10-16 下午11:09:38
*/
public class CustomerService
{
String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Singeton的例子当不指定作用域的时候spring默认的为singeton
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="testSpring" class="springapp.test.TestSpring">
</bean>
<bean id="exampleBean" class="springapp.test.ExampleBean"
factory-method="createInstance">
<constructor-arg type="int" value="7500000" />
<constructor-arg type="java.lang.String" value="42" />
</bean>
<bean id="customerService" class="springapp.test.CustomerService" />
</beans>
测试:
package springapp.test;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
*
* 测试作用域为singeton
* @author zhangxuegang
* @version 1.0
* @created 2012-10-16 下午11:12:55
*/
public class TestSingeton {
public static void main( String[] args )
{
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"file:F:/springProject/springapp/war/WEB-INF/applicationTest.xml");
CustomerService custA = (CustomerService)ctx.getBean("customerService");
custA.setMessage("Message by custA");
System.out.println("Message : " + custA.getMessage());
//retrieve it again
CustomerService custB = (CustomerService)ctx.getBean("customerService");
System.out.println("Message : " + custB.getMessage());
}
}
运行结果:
Message : Message by custAMessage : Message by custA
我们可以看到当作用为singleton时,无论你调用多少次getbean方法,
返回的都是一样的实例,因为在spring容器中只产生了一个单例的实例
当你每次调用customerServicebean的时候都想返回一个新的实例,那么你需要用prototype去替换它:
<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-2.5.xsd">
<bean id="customerService" class="com.mkyong.customer.services.CustomerService"
scope="prototype"/>
</beans>
测试结果:
Message : Message by custAMessage : null
基于注解的bean作用域:
package com.mkyong.customer.services;import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
@Service
@Scope("prototype")
public class CustomerService
{
String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
启动组件的自动扫描:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="com.mkyong.customer" />
</beans>
本文内容总结:Spring核心技术之Bean的作用域
原文链接:https://www.cnblogs.com/rafx/archive/2012/10/18/scopeofebean.html
以上是 Spring核心技术之Bean的作用域 的全部内容, 来源链接: utcz.com/z/362414.html