0

我正在学习 AOP,并且对切入点、建议等很满意。我很确定要问什么,但无论如何都想问。

我有一个方法,它接受一个 userId,从数据库中获取用户的记录,然后对记录做一些事情。我有 20 种不同的方法来做不同的事情,但它们都将 userId 作为输入并从数据库中获取记录。对我来说,这看起来像是一个可以拉入一个方面的横切关注点。

但是怎么做?我知道我可以访问参数(在这种情况下为 userId),访问方法的返回值并捕获方法异常。但是我如何给该方法一些可以使用的东西(在这种情况下记录在数据库中?)

public String printUserDetails(String userId)
{
    Record record = Database.fetchRecord(userId);
    System.out.println(record.getDetails());
    return record.getTitle();
}

那么,有没有办法将数据库访问代码拉到一个方面?

我能想到的一种方法是声明如下内容作为输入

class RequestObject
{
    String userId;
    Record record;
}

并在 Aspect 中注入记录,然后调用proceed()。但这不知何故感觉不对。

4

2 回答 2

1

IMO 使用用户 ID 解析用户不是横切关注点,因此方面不是正确的方法。接收 userId 的第一个登录页面实际上应该将其解析为 UserRecord,从那时起,userRecord 应该是在应用程序中移动的那个。

我可以从我的一个应用程序中对您的场景进行一个简单的类比,所有经过身份验证的 servlet 都希望 servletRequest.getRemoteUser() 返回与发送请求的用户相对应的有效用户登录。我们在我们的应用程序中修饰了HttpServletRequest将其解析为 User 对象,并且所有经过身份验证的 servlet 向下转换HttpServletRequestAuthenticatedServletRequest并提取该对象。应用程序中的其他人不再尝试解析用户登录。

于 2012-09-21T09:45:32.380 回答
0

如果这是您想知道的,您不能从 AspectJ 访问方法的局部变量。

剩下的问题与设计有关,答案取决于您想要实现的目标。您可以使用模板方法设计模式避免多个方法中的代码重复。如果您将它们重构为具有成员而不是局部变量,则可以将真实或模拟对象注入到类中。如果您通过直接重构您的类或通过 AspectJ (ITD)[http://www.eclipse.org/aspectj/doc/next/progguide/starting-aspectj.html#inter-type-declarations 创建成员,这是另一个问题] 机制。第三个问题是您是否可能想要使用方面进行缓存以避免多次从数据库中获取相同的对象。

我不确定你到底想达到什么目标,所以我无法更具体地回答。

于 2012-09-22T08:17:03.930 回答