Scope,也称作用域,在Soring Ioc容器指其创建的Bean对象对其他Bean对象的请求可见范围,在Spring IoC 容器中具有以下几种作用域:
①、基本作用域(singleton,prototype)
②、web作用域(request,session,globalsession)
③、自定义作用域
代码示例
public class ColorBean {
}
@Configuration
public class ColorConfiguration {
@Bean
@Scope
public ColorBean colorBean(){
return new ColorBean();
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class JuniterTestColor {
@Test
public void testImportBean(){
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(ColorConfiguration.class);
ColorBean object1=(ColorBean)annotationConfigApplicationContext.getBean("colorBean");
ColorBean object2=(ColorBean)annotationConfigApplicationContext.getBean("colorBean");
log.info("object1的hashCode"+object1.hashCode());
log.info("object2的hashCode"+object2.hashCode());
log.info("两个对象是否相同"+(object1==object2));
}
}
当使用@Scope默认的singleton的时候输出结果:
2020-04-11 12:41:04.687 INFO 103152: object1的hashCode853913427
2020-04-11 12:41:04.688 INFO 103152 : object2的hashCode853913427
2020-04-11 12:41:04.688 INFO 103152 : 两个对象是否相同true
@Scope(“prototype”)的时候输出结果
2020-04-11 12:49:37.690 INFO 103268 : object1的hashCode50058128
2020-04-11 12:49:37.691 INFO 103268: object2的hashCode23507230
2020-04-11 12:49:37.691 INFO 103268 : 两个对象是否相同false
总结:
基本作用域
①、当在使用singleton定义bean的时候,我们在容器获取到bean为同一个实体对象
②、我们使用prototype定一个bean的时候,我们从spring容器中获取到不是同一个类
如果不指定Bean的作用域,Spring默认使用singleton作用,java在创建实例是,需要进行内存申请,销毁实例时,需要完成垃圾回收,这些工作都会导致系统开销增加。因此,prototype作用域Bean的创建,销毁的代价比较大,从而singleton作用域的Beans实例一旦创建成功,可以重复的使用,因此,除非必要,否则尽量避免将Bean被设置成prototype作用域。
在web中
①、request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效
②、session:对于每次HTTP Session,使用session定义的Bean都将产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效
③、globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效