在REST服务中使用AOP进行数据检索优化

时间:2016-07-04 14:02:58

标签: java spring spring-mvc aop

我正在使用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(无状态)应用程序中至少在各个方面之间共享对象?在这些情况下,您能否建议采用不同的方法来最小化数据访问?

2 个答案:

答案 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);