Spring中Bean的作用域--@Scope

1.Scope

在IOC容器中可以使用scope来设置对象的作用域。简单来说,scope就是spring容器(IOC容器)中的生命周期,也可以说是对象在spring容器中的创建方式。

在spring容器中有以下几种作用域:

  1. singleton(单例):全局有且仅有一个实例
  2. prototype(多例):每次获取Bean的时候会有一个新的实例
  3. Web 作用域(reqeust、session、globalsession)
    (1)request:request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
    (2)session:session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
    (3)globalsession:global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义
  4. 自定义作用域

2.@Scope注解的使用

直接在bean对象方法上增加@Scope注解就可以,@Scope注解默认的singleton实例
User.java

public class User {
    private String username;
    private Integer age;

    public User(String username, Integer age) {
        this.username = username;
        this.age = age;
    }
}

AppConfig.java

@Configuration
public class AppConfig {
    @Scope
    @Bean("users")
    public User getUser(){
        System.out.println("创建实例");
        return new User("aaa",11);
    }
}

TestDemo01.java

public class TestDemo01 {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        User users1 = (User)context.getBean("users");
        System.out.println("实例一:"+users1.toString());
        User users2 = (User)context.getBean("users");
        System.out.println("实例二:"+users2.toString());
    }
}

运行结果

创建实例
实例一:com.msj.demo01.User@48503868
实例二:com.msj.demo01.User@48503868

接下来把实例类型改为prototype如下:

@Configuration
public class AppConfig {
    @Scope("prototype")
    @Bean("users")
    public User getUser(){
        System.out.println("创建实例");
        return new User("aaa",11);
    }

运行结果:

创建实例
实例一:com.msj.demo01.User@48503868
创建实例
实例二:com.msj.demo01.User@6895a785

从上面可以得出,singleton是不管几次获取Bean,都只有一个实例,而prototype是每一次获取Bean,就会创建一个新的实例。

你可能感兴趣的:(Spring中Bean的作用域--@Scope)