重学Spring框架系列之——设置Bean的加载时机

本文可能会涉及到一些bena的作用域相关的知识,如果对其不是特别了解的可以查看我上一篇文章。

bean的作用域为singleton和prototype时,其对应的加载时机是不同的。

通常情况下spring中bean为单例时,bean实例的创建是在加载配置文件或配置类时创建的,而bean为多实例时,bean实例的创建是在获取该实例时创建的。

通过文字描述可能比较抽象下面通过代码来查看一下。

注意:spring创建实例时默认调用的是无参构造,下面我们在无参构造中加上输出语句用于查看调用时机。

public class Car {

  public Car() {
    System.out.println("Car的无参构造执行了!");
  }
}

public class User {

  public User() {
    System.out.println("User的无参构造执行了!");
  }
}

创建配置类。

@Configuration
public class BeanScopeConfig {

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

  // Car采用默认配置,也就是单实例
  @Bean
  public Car car() {
    return new Car();
  }
}

验证bean的作用域对加载时机的影响。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

单实例Bena的加载时机也是可以进行设置的,我们可以通过配置将其设置为懒加载,也就是在第一次获取bean实例时进行加载。

编写用于设置单实例bean为懒加载的Train类。

public class Train {

  public Train() {
    System.out.println("Train的无参构造执行了!");
  }
}

方式一:通过xml配置文件设置bean的加载时机。

1、设置bean标签的lazy-init属性,该属性有三个值分别是:懒加载的true和不是懒加载的false和default。

设置Train类的bean实例为懒加载。

<bean id="train" class="com.springtest.bean.Train" lazy-init="true" />

2、验证懒加载是否生效。

在这里插入图片描述
在这里插入图片描述

有时候我们会有多个类都需要设置为懒加载,那么一个类一个类的设置会比较麻烦,此时我们就可以在Spring配置文件的标签上设置“default-lazy-init”属性,用于设置整个配置文件中创建的类都是懒加载。

beans标签的default-lazy-init属性的取值以及值的含义和bean标签的lazy-init属性一样。

方式二:通过@Lazy注解设置bean的加载时机。

1、查看@Lazy注解的源代码,来了解它的用法。

在这里插入图片描述

2、编写配置类,使用@Lazy注解,设置Train为懒加载。

@Configuration
public class BeanLoadingConfig {

  @Bean
  @Lazy
  public Train train() {
    return new Train();
  }
}

3、验证是否生效。

在这里插入图片描述
在这里插入图片描述

@Lazy注解也可以添加在配置类上,这样整个配置类中创建的bean将都是懒加载。

注意:假设现在有A和B两个类,A类没有设置为懒加载,B类设置为懒加载。A类中使用到了B类,那么此时B类将会在随着A类的初始化而初始化。

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值