Spring单例 和 Scope注解

关键字  @Scope  @Qualifier  Singleton

 

单例

Spring是单例模式。结合Springboot的例子。

Controller

@Autowired private TestBean tb;

@RequestMapping("/single")
public String single() {
        tb.setAge(tb.getAge() + 10 );
        // 每次输出的hashcode一样,同一个实例。age在累加,也证明是单例。
        return String.valueOf(tb.getAge()) + "===>" + this.hashcode();   
}

 

Bean

@Component
public class TestBean {
    private int age;

    public int getAge() {
        return age;
    }

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

 

从不同的客户端或者机器访问url   /single  均返回累加值,证明是单例。因此Spring单例模式中谨慎使用类变量。

单例不阻塞

两个不同IP的请求,请求到同一个单例controller中的sleep方法,均会执行,不会因为一个sleep, 另一个阻塞

    @RequestMapping("/sleep")
    public String sleep() throws InterruptedException {
        System.out.println("begin sleeping");
        Thread.sleep(100 * 1000);
        return "finish sleeping";
    }

 

Scope

Bean的Scope标签可以指定bean在Spring单例的范围和是否为单例,解释常用的两个

(1)singleton:在spring容器中的单例,通过spring容器获得该bean时总是返回唯一的实例 (默认)
(2)prototype:每次获得bean都会生成一个新的对象

 

posted @ 2019-04-04 15:19  webglcn  阅读(728)  评论(0编辑  收藏  举报