戴着假发的程序员出品 抖音ID:戴着假发的程序员 欢迎关注
@Scope注解
spring应用手册(第二部分)
@Scope注解源码:
package org.springframework.context.annotation;
@java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD})
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@java.lang.annotation.Documented
public @interface Scope {
@org.springframework.core.annotation.AliasFor("scopeName")
java.lang.String value() default "";
@org.springframework.core.annotation.AliasFor("value")
java.lang.String scopeName() default "";
org.springframework.context.annotation.ScopedProxyMode proxyMode() default org.springframework.context.annotation.ScopedProxyMode.DEFAULT;
}
@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的实例。
案例:
@Component
@Scope(value= ConfigurableBeanFactory.SCOPE_SINGLETON)
public class AuthorDAO implements IAutorDAO {
@Override
public String get() {
return "戴着假发的程序员";
}
}
注意:value属性和scopeName并不是互斥的,也就是可以同时配置,但是这两个配置的范围必须一致,如果不一致会抛异常。(当然我觉得不会有人非要两个属性一起配置)