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

免费 AI IDE


更多建议: