【Spring4.0笔记整理六】Bean的作用域

版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/80261225

  我们在前几章讲的都是在创建 IOC容器 的时候就实例化所有的 单例Bean,这一点我们在讲使用 XML配置 Bean 的时候就提到过。其实我们之前使用的 Bean 都是单例的,也就是每次从 IOC容器 中取出的 Bean 其实都是同一个对象。
  
  我们可以验证一下,假设 IOC容器 中有一个名字叫 car 的 Bean:

Car car = (Car) ioc.getBean("car");
Car car2 = (Car) ioc.getBean("car");
car == car2;  // 返回:true

  默认情况下,Spring 只为每个在 IOC 容器 里声明的 Bean 创建唯一一个实例,整个 IOC容器 范围内都能共享该实例。我们使用 getBean() 方法和 Bean 引用都将返回这个唯一的 Bean 实例。我们把这个 Bean 的作用域称为 singleton,它是所有 Bean 的默认作用域。

  那么不知道大家有没有想过如何改变这一现象呢?

  我们只需要在 XML中配置 Bean 的时候加 scope属性,或者给对应的 Bean 加一个 @Scope注解 即可。

  我们今天就来学习一下如何通过 XML配置 Bean 和通过注解配置 Bean 来设置其作用域。

最常见的两个作用域:

  一、singleton

  默认值。容器初始化时创建 bean 实例。在整个容器的生命周期内只创建这一个 bean。它是单例的。

  二、prototype

  原型的。容器初始化时不会创建 bean 实例。而在每次请求时都创建一个新的 Bean 实例,并返回。


注意: Spring 中的 Singleton 主要是针对 “一个 IOC容器 维持一个 Bean实例” 而言的。与设计模式上谈到的Singleton 不同,设计模式上谈到的 Singleton,是指对每个 ClassLoader 所载入的类产生一个实例。





一、在 xml 中设置 Bean 的作用域

<bean id="car" class="com.sun.test3.Car" p:id="20" p:name="ss" scope="prototype" />



二、使用注解设置Bean的作用域

@Scope("prototype")
@Component
public class Car {
    private int id;
    private String name;
}




猜你喜欢

转载自blog.csdn.net/sun8112133/article/details/80261225