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)