2.11 @Scope注解
戴着假发的程序员出品 抖音ID:戴着假发的程序员 欢迎关注
[查看视频教程]
@Scope注解源码:
1 package org.springframework.context.annotation; 2 3 @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD}) 4 @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) 5 @java.lang.annotation.Documented 6 public @interface Scope { 7 @org.springframework.core.annotation.AliasFor("scopeName") 8 java.lang.String value() default ""; 9 10 @org.springframework.core.annotation.AliasFor("value") 11 java.lang.String scopeName() default ""; 12 13 org.springframework.context.annotation.ScopedProxyMode proxyMode() default org.springframework.context.annotation.ScopedProxyMode.DEFAULT; 14 }
@Scope可以注解在某个交给spring管理的类上方,也可以注解在@Bean注解的方法上方。作用和配置文件中bean标签的scope属性一致。主要用于配置交给spring管理的bean的作用域。
主要有以下几个值:
singleton:单例模式(默认);
prototype:多例模式;
request:作用于web应用的请求范围;
session:作用于web应用的会话范围;
当然我们还可以使用字符串常量配置:
ConfigurableBeanFactory.SCOPE_SINGLETON(单利)
ConfigurableBeanFactory.SCOPE_PROTOTYPE(多例)
WebApplicationContext.SCOPE_SESSION(会话范围)
WebApplicationContext.SCOPE_REQUEST(请求范围)
单利模式下,spring只会为当前bean创建一个实例,每次从spring容器中获取的都是同一个对象。并且在spring容器初始化时,就会创建该对象。
多利模式下,spring初始化时不会创建该对象,每次从spring容器中获取这个bean对象时,spring都会创建要给新的。
回话范围和请求范围是web应用专用的,回话范围,spring会为每次回话创建要给当前Bean的实例。请求范围,spring会为每次请求创建一个当前bean的实例。
案例:
1 @Component 2 @Scope(value= ConfigurableBeanFactory.SCOPE_SINGLETON) 3 public class AuthorDAO implements IAutorDAO { 4 @Override 5 public String get() { 6 return "戴着假发的程序员"; 7 } 8 }
注意:value属性和scopeName并不是互斥的,也就是可以同时配置,但是这两个配置的范围必须一致,如果不一致会抛异常。(当然我觉得不会有人非要两个属性一起配置)