我正在使用Spring MVC(Spring Boot)实现REST服务,并且我正在创建一些Aspect
来处理服务的一些交叉功能。
一个例子是这样的服务方法:
public void doSomethingWithUser(int userId){
// retrieve user from DB and do something...
}
并在我的Aspect
课程中使用以下方法:
@Around("execution(* com.test.myrestsvc.services.MyService.doSomethingWithUser(..))")
public void aroundDoSomething(ProceedingJoinPoint pjp) throws Throwable {
// retrieve user (the same retrieved in the method) and do something else...
}
正如您所看到的,我有两种方法使用相同的用户对象执行不同的操作,因此即使已经在main方法中检索到用户,我也必须执行两次相同的查询。
请注意,对于我的服务层中的某些方法,我有几个方面由单个方法调用触发,这会多次将用户检索相乘。
所以我想知道:有没有办法在REST(无状态)应用程序中至少在各个方面之间共享对象?在这些情况下,您能否建议采用不同的方法来最小化数据访问?
答案 0 :(得分:0)
您可以尝试使用Spring级别缓存,这里很简单tutorial,但要小心并注意缓存驱逐策略。
如果您将Spring Data JPA与Hibernate或EclipseLink一起使用,您还可以尝试在JPA实现提供程序中启用二级缓存:Example
答案 1 :(得分:0)
尝试将java.lang.ThreadLocal用于这些用例。它非常方便,我总是用它来共享数据
ThreadLocal<SessionMap> sessionThreadLocal = new ThreadLocal<SessionMap>();
SessionMap session = sessionThreadLocal.get();
if (null == session) {
session = new SessionMap();
sessionThreadLocal.set(session);
}
User userObj = //getUser;
session.put("user", userObj);