springboot教程-选择单例还是多例单例的应⽤场景
如 Controller、service、dao,没必要每个请求都新建⼀个对象,既耗费CPU、⼜耗费内存
5. 创建对象时耗时过多或者耗资源过多,但⼜经常⽤到的对象。
6. 没有成员变量的类
7. 频繁访问数据库或⽂件的类
8. 其他要求只有⼀个对象的场景
多例的应⽤场景springboot是啥
有成员变量的 service
单例的问题
service
增加 name 成员变量,get、set⽅法
@Service
public class StudentSrvImpl implements IStudentService {
private String name;
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.String());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
第⼀个Controller
@RestController
public class StudentCtrl {
@Autowired
private IStudentService studentSrv;
@RequestMapping("/test")
public JsonResult test() throws InterruptedException {
StudentSrvImpl imp=(StudentSrvImpl)studentSrv;
System.out.Class()+"::设置名字为:李雷");
imp.setName("李雷");
Thread.sleep(5000);
System.out.Class()+"::"+Name());
return new JsonResult(0,"执⾏成功!");
}
}
第⼆个Controller
@RestController
public class StudentCtrl2 {
@Autowired
private IStudentService studentSrv;
public StudentCtrl2(){
System.out.println("StudentCtrl()构造⽅法");
}
@RequestMapping("/test2")
public JsonResult test() throws InterruptedException {
StudentSrvImpl imp=(StudentSrvImpl)studentSrv;
System.out.Class()+"::设置名字为:韩梅梅");
imp.setName("韩梅梅");
System.out.Class()+"::"+Name());
return new JsonResult(0,"执⾏成功!");
}
}
执⾏
执⾏流程:
1. 第⼀个Controller先修改 service 的name为 李雷,然后延迟5秒
2. 然后第⼆个Controller修改 service 的name为 韩梅梅,然后打印name值
3. 最后,第⼀个Controller打印name值,此时显⽰的是 韩梅梅
总结
单例模式下,StudentSrvImpl 的成员变量会被多个Controller修改,此时会导致数据混乱
当有成员变量,⽽且成员变量的值会改变时,就不要使⽤单例模式,否则会互相⼲扰,此时应该⽤多例模式解决
使⽤多例模式,加上 @Scope("prototype") 注解
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论