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都会生成一个新的对象