我不确定我的代码是否是线程安全的,有人可以帮忙吗?
@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());
并且当注入工作时,它将SessionObjectFactory
与Proxy
包装在一起,以根据需要从ThreadLocal<RequestAttributes>
变量调用实际方法。这意味着,当然,如果当前线程是Servlet线程,则每次调用MyAspect.myMethod
都会为具体的HttpSession
做些事情。
因此,您的问题的答案是:是的,它是线程安全的。