重学Spring框架系列之——设置Bean的作用域

Bean的作用域

在Spring中,默认情况下创建的bean都是单实例对象,当然也可以通过实际的需求进行修改。我们可以将这种操作视为设置bean的作用域。实现的方式有配置文件和注解两种形式,然而不论是哪种方式它们都对应了四种作用域。

这四种作用域分别为:

singleton(默认值):表示创建的对象是单实例的。
prototype:表示创建的对象是多实例的。
request:表示一次请求生成一个实例。
session:表示一次会话生成一个实例。

注:在这四种作用域中,singleton和prototype比较常用,进而演示的时候也是以这两种为主。

代码演示

编写用于演示的两个java类

public class User {

}

public class Car {

}

通过xml形式设置bean的作用域

1、编写配置文件。

通过设置bean标签的scope属性来设置bean的作用域。

<!-- 注入User类,设置bean为单实例。scope="singleton"可以省略不写,因为spring默认创建的bean就是单实例的 -->
<bean id="user" class="com.springtest.bean.User" scope="singleton"/>
<!-- 注Car类,设置bean为多实例 -->
<bean id="car" class="com.springtest.bean.Car" scope="prototype"/>

2、编写测试类进行验证。

@Test
public void test1() {
    // 创建Spring的IOC容器
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    // User设置的是单实例,Car设置的多实例。通过比较地址进行验证。
    Object user1 = context.getBean("user");
    Object user2 = context.getBean("user");
    if(user1 == user2) {
      System.out.println("通过Spring创建的User是单实例对象!");
    } else {
      System.out.println("通过Spring创建的User是多实例对象!");
    }
    Object car1 = context.getBean("car");
    Object car2 = context.getBean("car");
    if(car1 == car2) {
      System.out.println("通过Spring创建的Car是单实例对象!");
    } else {
      System.out.println("通过Spring创建的Car是多实例对象!");
    }
}

3、验证结果。

在这里插入图片描述

通过注解形式设置bean的作用域

使用@scope注解可以设置bean的作用域。该注解可作用在类和方法上。通过设置注解value属性的值来设置bean的作用域。value属性的取值范围和通过xml形式设置时一样。

1、编写配置类,并通过@Bean注解注bean。

@Configuration
public class BeanScopeConfig {

  @Bean
  @Scope(value = "prototype") // 设置User为多实例
  public User user() {
    return new User();
  }

  @Bean
  @Scope(value = "singleton") // 设置Car为单实例
  public Car car() {
    return new Car();
  }
}

2、编写测试类进行验证。

@Test
public void test2() {
    // 创建Spring的IOC容器
    ApplicationContext context = new AnnotationConfigApplicationContext(BeanScopeConfig.class);
    // User设置的是多实例,Car设置的单实例。通过比较地址进行验证。
    Object user1 = context.getBean("user");
    Object user2 = context.getBean("user");
    String userScope = user1 == user2 ? "User为单实例对象!" : "User为多实例对象!";
    System.out.println(userScope);
    Object car1 = context.getBean("car");
    Object car2 = context.getBean("car");
    String carScope = car1 == car2 ? "Car为单实例对象!" : "Car为多实例对象!";
    System.out.println(carScope);
}

3、验证结果。

在这里插入图片描述

今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞、转发加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值