美文网首页Java 杂谈SSM
003Spring注解@Scope

003Spring注解@Scope

作者: 编程界的小学生 | 来源:发表于2018-07-03 11:23 被阅读9次

1、简介

@Scope指定bean的作用域。

2、基础类

public class User {

    private String name;

    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public User() {
    }

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

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

3、@Scope

3.1、取值

@see ConfigurableBeanFactory#SCOPE_PROTOTYPE ==> (prototype)
@see ConfigurableBeanFactory#SCOPE_SINGLETON ==> (singleton)
@see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST ==> (request)
@see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION ==> (session)

3.2、默认值

ConfigurableBeanFactory#SCOPE_SINGLETON ==> (singleton)

3.3、singleton

3.3.1、概述

单实例的,IOC容器启动的时候就会调用方法去创建对象,并将创建的对象放到IOC容器中(一个大的map工厂),以后每次获取该对象就是直接从容器(map.get())中去拿,而不是每次都重新创建一个对象出来,单例模式。

3.3.2、证明单例

3.3.2.1、配置类
@Configuration
public class MainConfig {

    /**
     * @see ConfigurableBeanFactory#SCOPE_PROTOTYPE
     * @see ConfigurableBeanFactory#SCOPE_SINGLETON
     *
     * prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中,每次获取的时候才会调用方法去创建对象。
     * singleton:单实例的(缺省值):ioc容器启动会调用方法去创建对象放到ioc容器中,以后每次获取就是直接从容器(map.get())中拿。
     * request:同一次请求创建一个实例
     * session:同一个session创建一个实例
     *
     * @return
     */
    @Scope
    @Bean("user")
    public User user() {
        System.out.println("给容器中添加user....");
        return new User("张三", 28);
    }
}
3.3.2.2、测试类
public class ScopeTest {

    @Test
    public void test01() {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        System.out.println("IOC容器创建完成......");
        User user1 = applicationContext.getBean("user", User.class);
        User user2 = applicationContext.getBean("user", User.class);
        System.out.println(user1 == user2);
    }

}
3.3.2.3、测试结果
给容器中添加user....
IOC容器创建完成......
true

PS:

结果分析:

首先我们发现:在创建容器的时候(创建完之前)就开始实例化各种scope为singleton的bean到容器中。然后才是容器创建完,当获取多次这个bean的时候,都不会重新创建对象,而是直接从容器中获取的,所以获取了两次都返回了同一个对象,所以对比地址返回true。

3.3.3、证明在创建容器的时候就实例化单例bean

3.3.3.1、修改测试类
public class ScopeTest {

    @Test
    public void test01() {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        System.out.println("IOC容器创建完成......");
    }

}
3.3.3.2、测试结果
给容器中添加user....
IOC容器创建完成......

3.4、prototype

3.4.1、概述

多实例的:IOC容器启动并不会去调用方法创建对象并放到容器中,每次只有当你获取该对象的时候才会去调用方法创建该对象,并且不是单例的,每次获取都会创建一个新的对象。

3.4.2、证明多例

3.4.2.1、配置类
@Scope("prototype")
@Bean("user")
public User user() {
    System.out.println("给容器中添加user....");
    return new User("张三", 28);
}
3.4.2.2、测试类
public class ScopeTest {
    @Test
    public void test01() {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        System.out.println("IOC容器创建完成......");
        User user1 = applicationContext.getBean("user", User.class);
        User user2 = applicationContext.getBean("user", User.class);
        System.out.println(user1 == user2);
    }
}
3.4.2.3、测试结果
IOC容器创建完成......
给容器中添加user....
给容器中添加user....
false

PS:

结果分析:

可以发现:IOC容器先是创建完成了(这时候并没有创建bean),然后我们getBean(),这个时候开始往容器中真正的添加bean,并且是每一次获取对象,都会重新创建出一个新的实例来,所以两个对象对比是false。

3.5、其他

request、session不讲解。

4、广告

img
  • 今日头条号:编程界的小学生

相关文章

网友评论

    本文标题:003Spring注解@Scope

    本文链接:https://www.haomeiwen.com/subject/ndyduftx.html