springboot教程-@Scope详解
介绍
@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;
}
使用
搭配 @Controller、@Service、@Repository、@Component 、@Bean 使用,修饰类
属性
value:取值如下:
-
singleton:单例,(默认) prototype:多例 request session globalsession
解释见: https://www.malaoshi.top/show_1IX1mKQApo4.html
例子1
修改Controller,再增加一个 IStudentService 成员变量
@RestController
public class StudentCtrl {
@Autowired
private IStudentService studentSrv;
@Autowired
private IStudentService studentSrv2;
@Autowired
public StudentCtrl(){
System.out.println("StudentCtrl()构造方法");
}
@RequestMapping("/save")
public JsonResult save( Student student){
// System.out.println(student);
System.out.println(studentSrv);
System.out.println(studentSrv2);
System.out.println(studentSrv==studentSrv2);
studentSrv.save(student);
return new JsonResult(0,"保存成功!");
}
}
访问该 Controller,打印 studentSrv 和 studentSrv2 的内存地址,是一样的,而且打印 true
例子2
在上面例子基础之上,继续修改 StudentSrvImpl,增加 @Scope("prototype") 注解
@Service
@Scope("prototype")
public class StudentSrvImpl implements IStudentService {
public StudentSrvImpl(){
System.out.println("StudentSrvImpl构造方法"+this);
}
@Override
public List<Student> query() {
System.out.println("调用 StudentSrvImpl 的query()方法");
return null;
}
public void save(Student student){
System.out.println("调用 StudentSrvImpl 的save()方法");
System.out.println(student.toString());
}
}
访问 Controller,打印 studentSrv 和 studentSrv2 的内存地址,可以看出2个对象的 内存地址不同,并且是false,说明创建了2个对象
下一篇:
python 课后习题汇总(实验3)
