我不确定我的代码是否是线程安全的,有人可以帮忙吗?

@Aspect
public class MyAspect {

   @Autowired
   private HttpSession session;


   @Before("...")
   private void myMethod() {
       seesion.getId();
   }

}


因为MyAspect的范围是默认值(单例),所以有很多请求同时存在,也有很多会话。好的,我在我的代码中进入了哪个会话?线程安全吗?还是代码错误,如果有错,我该怎么办?

谢谢!

最佳答案

对,没关系


无论如何,您的MyAspect应该被注册为bean。
不管是否是AOP方面,都没有关系:依赖项注入基础结构相同。
现在关于HttpSession
这个对象没有注册为bean,但是Spring为他提供了一个技巧-WebApplicationContextUtils.SessionObjectFactory。该对象注册为


beanFactory.registerResolvableDependency(HttpSession.class, new SessionObjectFactory());

并且当注入工作时,它将SessionObjectFactoryProxy包装在一起,以根据需要从ThreadLocal<RequestAttributes>变量调用实际方法。这意味着,当然,如果当前线程是Servlet线程,则每次调用MyAspect.myMethod都会为具体的HttpSession做些事情。

因此,您的问题的答案是:是的,它是线程安全的。

09-09 17:56