在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 custA Message : 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 custA Message : 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>