本文可能会涉及到一些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类的初始化而初始化。
今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞、转发加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。