在Spring框架中,单例(singleton)和原型(prototype)bean作用域是最常见的两种作用域,它们的区别如下:
- 单例(singleton)作用域:单例是默认的作用域,表示在整个应用程序中只会创建一个bean实例,并且所有的请求都会共享这个实例。当容器加载时,该bean就会被创建并放入容器中,之后每次请求该bean时都会返回同一个实例。这种作用域适用于那些不会改变状态的对象,例如配置对象、工具类等。
- 原型(prototype)作用域:原型作用域表示每次请求该bean时都会创建一个新的实例。也就是说,每个请求都会得到一个新的实例。这种作用域适用于那些需要频繁改变状态的对象,例如session对象、用户对象等。
下面是一个示例,演示了单例和原型作用域的区别:
@Component
@Scope("singleton")
public class MySingletonBean {
private int count = 0;
public int getCount() {
return count++;
}
}
@Component
@Scope("prototype")
public class MyPrototypeBean {
private int count = 0;
public int getCount() {
return count++;
}
}
在上面的示例中,MySingletonBean
和MyPrototypeBean
都是Spring组件,分别使用了单例和原型作用域。它们都有一个getCount
方法,每次调用该方法都会将count
属性加1并返回。现在我们可以在其他组件中注入这两个组件,并测试它们的行为:
@Component
public class MyTestBean {
@Autowired
private MySingletonBean singletonBean;
@Autowired
private MyPrototypeBean prototypeBean;
public void test() {
System.out.println("Singleton bean count: " + singletonBean.getCount());
System.out.println("Singleton bean count: " + singletonBean.getCount());
System.out.println("Prototype bean count: " + prototypeBean.getCount());
System.out.println("Prototype bean count: " + prototypeBean.getCount());
}
}
执行结果:
Singleton bean count: 0
Singleton bean count: 1
Prototype bean count: 0
Prototype bean count: 0
在上面的示例中,我们注入了一个MySingletonBean
和一个MyPrototypeBean
,并在test
方法中调用它们的getCount
方法。我们会发现,无论调用多少次singletonBean.getCount()
,都只会得到同一个计数器的值,而prototypeBean.getCount()
每次调用都会得到一个不同的计数器的值。这就是单例和原型作用域的区别。