当前位置: 首页 > 知识库问答 >
问题:

Spring MVC 3用于@Autowired Singleton线程安全

梁才
2023-03-14

嗯,我有三层来自控制器-

代码如下所示:

用户控制器。Java语言

@Controller
@RequestMapping("/users")
public class UserController extends ExceptionExtension {
     @Autowired
     private IUserService userService;

     @RequestMapping(value = { "/update", "/update/" }, method = RequestMethod.GET)
     public String updateUser(@RequestParam("email") String eMail, ModelMap model)
        throws Exception {

          if (eMail.isEmpty() || eMail == null) {
              throw new ArgumentIsEmptyException("Required String parameter 'email' is empty");
          } else {
              UserModel userModel = userService.setUser(eMail);

              if (userModel != null) {
                  model.put("roleList", userService.setRoleList());
                  model.put("title", "Update Existing User");
                  model.put("post", "/users/post/update");
                  model.put("userForm", userModel);

                  return "users.update";
              } else {
                  model.put("title", "Update Existing User");
                  model.put("result", "<font color='red'><u>" + eMail + "</u> does not exist in the database.</font>");
                  model.put("flag", "Error");

                  return "users.result";
              }
          }
     }
}

用户服务。Java语言

public class UserService implements IUserService {

    @Autowired
    private IUserManager userManager;

    public UserModel setUser(String eMail) {
        UserModel userModel = new UserModel();
        Entity userEntity = userManager.getUser(eMail);

        if (userEntity != null) {
            userModel.setEMail(eMail);
            userModel.setRole(userEntity.getProperty("role").toString());
            userModel.setEnable((Boolean)userEntity.getProperty("enable"));

            return userModel;
        } else {
            return null;
        }
    }
}

例如,用户A和用户B同时运行相同的url,但参数不同
用户请求=

由于控制器是单例的,那么用户A的电子邮件变量是否会与用户B的电子邮件变量重叠,反之亦然?

我发现很难理解Singleton Thread-Safe在这种情况下是如何工作的。我的@Service和@Repository是否应该声明为@Scope(“原型”),以便内部方法变量与新实例隔离?

====

使用范围(“请求”)到我的@服务层,我点击了这个错误消息:/

3328[主]错误组织。springframework。网状物上下文ContextLoader-上下文初始化失败。springframework。豆。工厂BeanCreationException:创建名为“roleController”的bean时出错:自动连线依赖项的注入失败;嵌套异常为org。springframework。豆。工厂BeanCreationException:无法自动关联字段:private com。公司仪表板服务IRoleService公司。公司仪表板控制器。角色控制器。角色服务;嵌套异常为org。springframework。豆。工厂BeanCreationException:创建名为“roleService”的bean时出错:作用域“request”对于当前线程不是活动的;如果您打算从单例引用这个bean,请考虑为它定义一个作用域代理;嵌套异常为java。lang.IllegalStateException:未找到线程绑定请求:您是在实际web请求之外引用请求属性,还是在最初接收线程之外处理请求?如果您实际上在web请求中操作,并且仍然收到此消息,那么您的代码可能在DispatcherServlet/DispatcherPortlet之外运行:在这种情况下,请使用RequestContextListener或RequestContextFilter公开当前请求。

共有2个答案

傅和璧
2023-03-14

如果您像注释中建议的那样制作任何层范围:原型,那么您只是将问题再次移动到下面的层。

您需要决定您希望事务划分的位置。通常,这是在对服务的调用级别完成的。Spring可以为您处理。

控制器、服务和存储库通常应该以无状态的方式实现,也就是说,这些类没有方法修改的任何实例变量。否则你将很容易受到比赛条件的影响。最后,您的数据存储必须支持事务的使用。

您使用Google AppEngine数据存储。与任何RDBMS不同,它对事务有非常具体的方法。要从Java应用程序与appEngine交谈,我建议使用“客观”。首先阅读[关于它的概念](以及底层BigTable数据存储的概念1)。

宣原
2023-03-14

这里,线程安全取决于作用域为singleton时用户服务的内部锁定

这就是最终发生的事情=

将范围设置为请求。

在这种情况下,将为每个请求分配一个新bean,由于线程限制,整个操作是线程安全的。提供了在IUserSpace中相应的代码

 类似资料:
  • 问题内容: servlet是线程安全的吗?例如,如果我打开5个不同的浏览器并向容器中的一个servlet发送请求,它是否仍然是线程安全的,我特别指的是方法 问题答案: 您的问题可以归结为: 正在从同一对象线程safe上的多个线程调用方法 。答案是: 取决于 。如果您的对象(让它成为servlet)是无状态的或仅具有字段,则这是完全线程安全的。局部变量和参数是线程局部的(驻留在堆栈上,而不是堆上)。

  • 我有一个service方法,其中我通过ID从数据库请求一个实体。如果实体具有属性,我将其设置为true并执行某些操作。如果它只返回。 现在,如果同时有多个具有相同的请求,则该方法将不再一致,因为例如,第一个请求使用接收,因此它会做“一些事情”,如果第二个请求在第一个请求使用保存费用之前来到该方法,则即使第一个请求已经保存了费用,它也会做“一些事情”。这是一个正确的结论吗? 为了确保一次只能有一个请

  • 问题内容: HttpUrlConnection线程安全吗?即,如果我有一个连接到服务器的HttpConnection实例,并且该实例被不同的线程使用(例如,尝试同时发送POST),HttpUrlConnection将如何处理这种情况?a)他们将串行发送POST,还是b)第一个线程发送POST,获取响应,然后第二个线程发送POST?如果它们以串行方式发送POST,则意味着到同一tcp连接的多个活动P

  • 假设我有一个Executors静态工厂方法的ExecutorService实例。 如果我从某个线程提交了一个调用,其中RetVal不是线程安全的本地实例化对象,那么当我从同一个线程获得()它时,我需要担心retvals的完整性吗?人们说局部变量是线程安全的,但我不确定当您返回一个本地实例化的对象并从其他线程接收它时,它是否适用。 下面是我的定制实现,我只是为了测试。您可以忽略EType枚举。

  • 在PHP初期,是作为单进程的CGI来运行的,所以并没有考虑线程安全问题。 我们可以随意的在全局作用域中设置变量并在程序中对他进行修改、访问,内核申请的资源如果没有正确的释放, 也会在CGI进程结束后自动地被清理干净。 后来,php被作为apache多进程模式下的一个模块运行,但是这仍然把php局限在一个进程里, 我们设置的全局变量,只要在每个请求之前将其正确的初始化,并在每个请求之后正确的清理干净

  • 问题内容: 我对线程安全性有疑问。据我所知,SimpleDateFormat不是线程安全的。我想知道如果在spring控制器中以以下方式使用它会产生什么影响: 稍后在我的控制器功能中,我将其如下使用: 然后将calcDate添加到我的模型对象中,并返回ModelAndView。 那么用这种方式我会看到什么样的问题呢?是否只需删除static关键字即可解决任何问题,因为每个线程将使用其自己的date