Spring教程 - Spring Bean范围
Spring教程 - Spring Bean范围
当在Spring xml配置中定义Java bean或使用Spring注释时,我们可以将Java bean标记为 singleton
或原型
。
如果一个Java bean被标记为singleton,每次我们调用获取bean,我们得到相同的实例。
如果一个Java bean被标记为原型,每次我们将得到一个新的实例。
Java Bean
以下代码定义了具有String类型属性的Java bean。
package com.www.w3cschool.cnmon; public class MyService { String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
单身
如果在bean配置文件中未指定bean作用域,则默认为singleton。
<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.www.w3cschool.cnmon.MyService" /> </beans>
这里是运行上面定义的xml配置的代码。
package com.www.w3cschool.cnmon; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App { public static void main( String[] args ) { ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"SpringBeans.xml"}); MyService customerA = (MyService)context.getBean("customerService"); customerA.setMessage("Message by customerA"); System.out.println("Message : " + customerA.getMessage()); //retrieve it again MyService custB = (MyService)context.getBean("customerService"); System.out.println("Message : " + custB.getMessage()); } }
输出
Message : Message by customerA Message : Message by customerA
上面的代码从 ApplicationContext
中获取两次 MyService
。并且它在第一次调用后为消息设置一个String值。
从输出我们可以看到getMessage()调用都返回相同的消息,这意味着ApplicationContext使用 MyService
的一个副本。
如果bean是Spring IoC容器中的单例范围,getBean()将总是返回相同的实例。
Download Java2s_Spring_Singleton_Scope.zip
原型
如果bean是Spring IoC容器中的单例范围,getBean()将总是返回相同的实例。...
<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.www.w3cschool.cnmon.MyService" scope="prototype"/> </beans>
再次运行
再次运行...
Download Java2s_Spring_Prototype_Scope.zip
Bean作用域注释
以下代码显示了如何使用注释来标记bean范围。
package com.www.w3cschool.cnmon; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; @Service @Scope("prototype") public class MyService { 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.www.w3cschool.cnmon" /> </beans>
这里是新的App.java类来运行上面的配置。 customerService
更改为 myService
。Spring自动从类名创建一个bean名称,小写第一个信。
package com.www.w3cschool.cnmon; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App { public static void main( String[] args ) { ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"SpringBeans.xml"}); MyService customerA = (MyService)context.getBean("myService"); customerA.setMessage("Message by customerA"); System.out.println("Message : " + customerA.getMessage()); //retrieve it again MyService custB = (MyService)context.getBean("myService"); System.out.println("Message : " + custB.getMessage()); } }
再次运行
Download Java2s_Spring_Beans_Scope_Annotation.zip
更多建议: