【问题标题】:Get Session in Spring AOP在 Spring AOP 中获取会话
【发布时间】:2014-05-16 13:48:58
【问题描述】:
我不确定我的代码是否是线程安全的,有人可以帮忙吗?
@Aspect
public class MyAspect {
@Autowired
private HttpSession session;
@Before("...")
private void myMethod() {
seesion.getId();
}
}
因为 MyAspect 的作用域是默认的(单例),所以同时存在这么多请求以及许多会话。好的,我在我的代码中获得了哪个会话?它是线程安全的吗?或者它是一个错误的代码,如果它是错误的,如何可以吗?
谢谢!
【问题讨论】:
标签:
spring
session
thread-safety
aop
spring-aop
【解决方案1】:
好的,没关系。
您的MyAspect 无论如何都应该注册为 bean。
不管是不是 AOP Aspect:依赖注入基础设施都一样。
现在关于HttpSession。
这个对象没有注册为 bean,但是 Spring 为他提供了一个技巧 - WebApplicationContextUtils.SessionObjectFactory。该对象注册为
beanFactory.registerResolvableDependency(HttpSession.class, new SessionObjectFactory());
当注入工作时,它会将SessionObjectFactory 与Proxy 包装起来,以根据需要从ThreadLocal<RequestAttributes> 变量调用真实方法。这意味着,如果您当前的线程是 Servlet 线程,那么每次调用 MyAspect.myMethod 都会执行具体的 HttpSession。
所以,您的问题的答案是:是的,它是线程安全的。