作者:潘勇
时间:2019-3-27
1、Scope是什么?作用?
Scope在Spring称为作用域,主要的作用是描述Spring容器如何创建Bean实例的。通常默认情况下,Spring创建的bean都是单例(Singleton)的,单例的bean大家应该不陌生,换句话说,不管后期初始化的bean被注入到其他bean多少次,都不会变,它们都是同一个实例。
在设计模式种,有一种单例模式,相信小伙伴们再学习23种设计模式的时候都学过,通常情况下,我们的实例只会被初始化一次,同样这里我们的bean也只会初始化一次。
2、Scope 会声明哪些类型的bean
在项目中,我们不大可能只会用一种单例的bean,虽然单例的bean在大多数场合下都是理想的。所以我们来看下Spring都提供了哪些类型的bean。
(注意:单例的bean也只是针对一个容器而言,在这个容器里它只会初始化一次)
Spring 定义了四种作用域:
1、 单例类型(Singleton):整个应用只会创建一次
2、原型类型(Prototype): 每次注入或者通过Spring应用上下文获取的时候,都会重新初始化bean
3、会话类型(Session):在Web应用中,每一个会话会创建一个bean,这种概念也很好理解,就像我们在使用QQ时,我们会和不同的人聊天,每个聊天窗口称为一个会话,每个会话都是独一无二的
4、请求类型(Request):在Web应用中,每个请求创建一个bean实例
3、分析@Scope注解
我们大致也知道Spring提供的几种作用域,当然我们需要了解如何使用它们。Spring中声明bean的作用域是通过组合注解@Scope来实现的,我们先来看下Spring提供的@Scope注解。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Scope {
@AliasFor("scopeName")
String value() default "";
@AliasFor("value")
String scopeName() default "";
ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT;
}
我这里讲@Scope的注解的源码贴出来简单分析下,可以看出它是一个组合注解,也就是注解上标记了注解,先看@Target注解,@Target表示当前注解也就@Scope可以标注的范围,注解里的属性是ElementType.TYPE和ElementType.METHOD,ElementType是一个枚举类,TYPE表示可以标注在类、接口、注解、枚举这些类型的文件上,METHOD表示可以标注在方法上。
再看第二个注解@Retention表示该注解的加载时机,注解值是枚举类RetentionPolicy的RUNTIME,表示运行时加载。
第三个元注解@Document,主要表示被标注的目标会被记录到javadoc里,一般默认是不会的。
注(组合注解和元注解这个概念我们会单独拿一个章节内容介绍)