可能重复:
servlet如何工作?实例化,会话变量和多线程
servlet是线程安全的吗?对于ex如果我打开5个不同的浏览器并向容器中的一个servlet发送请求,它是否仍然是线程安全的,我service()特意指的是方法
在Spring中实现REST的情况下,spring控制器是单例.我想知道为什么弹簧控制器除了线程安全问题外都是单例.请帮助解决此问题.
我应该如何创建一个线程安全的控制器?
根据最佳实践,控制器为单例。
考虑下面的代码,其中我通过自动连接的服务对象存储用户数据,这使我的代码保持状态。我将如何使以下代码线程安全。
@RestController
class ApiController {
@Autowired
IDbService< User > iDBService;
@RequestMapping(value = "/api/adduser", method = RequestMethod.POST)
public ResponseEntity<User> createUser(@RequestBody User user){
User savedUser=iDBService.create(user);
return new ResponseEntity<User>(savedUser, HttpStatus.CREATED);
}
Run Code Online (Sandbox Code Playgroud)
这是我的服务实施。我在服务中共享了变量
public class IDbServiceImpl<T> implements IDBService<T>{
@Autowired
GenericRepository<T, Serializable> genericRepository;
@Override
public T create(T object) {
return genericRepository.save(object);
}
Run Code Online (Sandbox Code Playgroud)
}
我无法确定使用调度程序servlet在spring mvc中仅创建了一个bean对象,还是对每个请求都创建了一个新对象?
控制器代码:-
在代码中,我将在LoginBean对象中设置数据,并在方法abc中将其设置在modelandview对象中。
然后在jsp中我没有输入usename的任何值,在这种情况下,当我提交表单并且调用处理程序方法(initform)时,我试图打印的是相同的lb.getusername,这不会重现我的任何值。无法理解这个概念。
@Controller
public class LoginController{
ModelAndView mv=null;
EmployeeBean e=new EmployeeBean();
AutoBean autobean;
@Autowired
public LoginController(AutoBean autobean){
System.out.println("autobean");
this.autobean=autobean;
}
@RequestMapping(value="/login")
public ModelAndView abc(){
System.out.println("here");
System.out.println("here1");
LoginBean lb=new LoginBean();
lb.setUsename("ankita");//setting value
return new ModelAndView("login","loginbean",lb);
}
@RequestMapping(value="/abc1",method=RequestMethod.POST)
public ModelAndView initform(@ModelAttribute("loginbean")LoginBean lb,BindingResult result,Model model){
System.out.println("*****"+result.getErrorCount());
System.out.println("hello");
autobean.setName("yayme");
System.out.println(autobean.getName());
model.addAttribute("autobean", autobean);
System.out.println("username"+lb.getUsename());// query??
if(lb.getPassword().equals("ankita"))
/*{
mv=new ModelAndView();
e.setId("1001");
e.setName("ankita");
mv.addObject("employee", e);
mv.addObject("emp", new Emp());
mv.setViewName("success");
return mv;
}*/
return new ModelAndView("success","emp",new Emp());
else
return new ModelAndView("fail","lb1",lb);
}
Run Code Online (Sandbox Code Playgroud)
login.jsp
<form:form action="abc1" …Run Code Online (Sandbox Code Playgroud)