欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring入门(五):Spring Bean Scope讲解

程序员文章站 2022-05-26 14:26:08
1. 前情回顾 "Spring入门(一):创建Spring项目" "Spring入门(二):自动化装配bean" "Spring入门(三):通过JavaConfig装配bean" "Spring入门(四):使用Maven管理Spring项目" 2. 什么是Bean的Scope? Scope描述的是S ......

1. 前情回顾

spring入门(一):创建spring项目

spring入门(二):自动化装配bean

spring入门(三):通过javaconfig装配bean

spring入门(四):使用maven管理spring项目

2. 什么是bean的scope?

scope描述的是spring容器是如何新建bean的实例的。

spring常用的scope有以下几种,通过@scope注解来实现:

  1. singleton:一个spring容器中只有一个bean的实例,即全容器共享一个实例,这是spring的默认配置。
  2. prototype:每次调用新建一个bean的实例。
  3. request:web项目中,给每一个http request新建一个bean实例。
  4. session:web项目中,给每一个http session新建一个bean实例。

3. 示例

为了更好的理解,我们通过具体的代码示例来理解下singleton与prototype的区别。

3.1 新建singleton类型的bean

package scope;

import org.springframework.stereotype.service;

@service
public class demosingletonservice {
}

因为spring默认配置的scope是singleton,因此以上代码等价于以下代码:

package scope;

import org.springframework.context.annotation.scope;
import org.springframework.stereotype.service;

@service
@scope("singleton")
public class demosingletonservice {
}

3.2 新建prototype类型的bean

package scope;

import org.springframework.context.annotation.scope;
import org.springframework.stereotype.service;

@service
@scope("prototype")
public class demoprototypeservice {
}

3.3 新建配置类

package scope;

import org.springframework.context.annotation.componentscan;
import org.springframework.context.annotation.configuration;

@configuration
@componentscan("scope")
public class scopeconfig {
}

3.4 测试

新建一个main类,在main()方法中,分别从spring容器中获取2次bean,然后判断bean的实例是否相等:

package scope;

import org.springframework.context.annotation.annotationconfigapplicationcontext;

public class main {

    public static void main(string[] args) {
        annotationconfigapplicationcontext context = new annotationconfigapplicationcontext(scopeconfig.class);

        demosingletonservice s1 = context.getbean(demosingletonservice.class);
        demosingletonservice s2 = context.getbean(demosingletonservice.class);

        demoprototypeservice p1 = context.getbean(demoprototypeservice.class);
        demoprototypeservice p2 = context.getbean(demoprototypeservice.class);

        system.out.println("s1 与 s2 是否相等:" + s1.equals(s2));
        system.out.println("p1 与 p2 是否相等:" + p1.equals(p2));

        context.close();
    }
}

运行结果如下:

Spring入门(五):Spring Bean Scope讲解

从运行结果也可以看出,默认情况下即singleton类型的bean,不管调用多少次,只会创建一个实例。

4. 注意事项

singleton类型的bean,@scope注解的值必须是:singleton。

prototype类型的bean,@scope注解的值必须是:prototype。

即使是大小写不一致也不行,如我们将demoprototypeservice类的代码修改为:

package scope;

import org.springframework.context.annotation.scope;
import org.springframework.stereotype.service;

@service
@scope("prototype")
public class demoprototypeservice {
}

此时运行代码,就会报错:

Spring入门(五):Spring Bean Scope讲解

5. 源码

源码地址:,欢迎下载。

6. 参考

《java ee开发的颠覆者:spring boot实战》

欢迎扫描下方二维码关注公众号:申城异乡人。

Spring入门(五):Spring Bean Scope讲解