@Scope注解的使用方法
原文详细参考
1.@Scope注解是什么
@Scope注解是 Spring IOC 容器中的一个作用域,在 Spring IOC 容器中,他用来配置Bean实例的作用域对象。@Scope 具有以下几种作用域:
singleton 单实例的(单例)(默认) ----全局有且仅有一个实例
prototype 多实例的(多例) ---- 每次获取Bean的时候会有一个新的实例
reqeust 同一次请求 ----request:每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
session 同一个会话级别 ---- session:每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
2.@Scope注解怎么使用
直接在bean对象方法上增加@Scope注解即可。
① 在不指定@Scope的情况下,所有的bean都是单实例的bean,而且是饿汉模式加载(容器启动实例就创建好了)
@Bean
public Person person() {
return new Person();
}
②指定@Scope为 prototype 表示为多实例的,而且还是懒汉模式加载(IOC容器启动的时候,并不会创建对象,而是 在第一次使用的时候才会创建)
@Bean
@Scope(value = "prototype")
public Person person() {
return new Person();
}
3.singleton/prototype模式演示
/**
* Person类
*/
public class Person {
// Person类无参构造方法
public Person() {
System.out.println("执行Person构造器创建Person对象");
}
}
/**
* TODO 主配置类
*
* @author : lzb
* @date: 2021-03-05 13:50
*/
@Configuration
public class BeanConfig {
@Bean
@Scope(value = "singleton")
public Person person(){
return new Person();
}
}
3.1 singleton单例演示
@Scope注解默认为singleton单例,singleton实例的意思不管你使用多少次在springIOC容器中只会存在一个实例,演示如下只打印了一次创建实例:
public class DemoApplication {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(BeanConfig.class);
Person person = ac.getBean(Person.class);
Person person2 = ac.getBean(Person.class);
System.out.println(person);
System.out.println(person2);
System.out.println(person == person2);
}
}
可以发现singleton单例模式,在IOC容器中只会有一个实例存在,每次getBean()获取的实例对象都是同一个。
3.2 prototype多例演示
/**
* TODO 主配置类
*
* @author : lzb
* @date: 2021-03-05 13:50
*/
@Configuration
public class BeanConfig {
@Bean
@Scope(value = "prototype")
public Person person(){
return new Person();
}
}
发现prototype多例模式,每次在调用getBean() 获取实例时,都会重新调用 Person 类的无参构造方法,重新创建一个 Person 对象。
4.恶汉/懒汉
- 使用singleton单例,采用饿汉加载(容器启动,Bean实例就创建好了)
- 使用prototype多例,采用懒汉加载(IOC容器启动的时候,并不会创建对象实例,而是在第一次使用的时候才会创建