3

在我的 Spring 上下文文件中,我有这样的内容:

<bean id="userCheck" class="a.b.c.UserExistsCheck"/>
<aop:config>
      <aop:aspect ref="userCheck">
         <aop:pointcut id="checkUser"
                expression="execution(* a.b.c.d.*.*(..)) &amp;&amp; args(a.b.c.d.RequestObject)"/>
         <aop:around pointcut-ref="checkUser" method="checkUser"/>
      </aop:aspect>
</aop:config>    

abcUserExistsCheck 如下所示:

@Aspect
public class UserExistsCheck {

@Autowired
private UserInformation userInformation;

public Object checkUser(ProceedingJoinPoint pjp) throws Throwable {
    int userId = ... //get it from the RequestObject passed as a parameter
    if (userExists(userId)) {
        return pjp.proceed();
    } else {
        return new ResponseObject("Invalid user);
    }
}

被这些东西拦截的类看起来像这样:

public class Klazz {
    public ResponseObject doSomething(RequestObject request) {...}
}

这行得通。在将调用传递给 Klazz 之前,根据需要执行 UserExistCheck。问题是这是我让它工作的唯一方法。通过使用注释而不是上下文文件来完成这项工作似乎对我的小脑袋来说太过分了。那么......我究竟应该如何注释 UserExistsCheck 和 Klazz 中的方法?我还需要别的东西吗?另一个班级?上下文文件中还有内容吗?

4

3 回答 3

5

您是否启用了基于注释的 AOP?文档说你必须添加

<aop:aspectj-autoproxy/>

到你的弹簧配置。checkUser然后你需要在你的方法前面添加一个注解。看起来您需要@Around建议,如此所述。

@Aspect
public class UserExistsCheck {

  @Around("execution(* a.b.c.d.*.*(..)) && args(a.b.c.d.RequestObject)")
  public Object checkUser(ProceedingJoinPoint pjp) throws Throwable {
于 2010-04-10T03:02:45.530 回答
3

从您提供的示例代码来看,您似乎正在尝试为不实现任何接口的类创建建议。如 Spring 文档的Proxying Mechanisms部分所述,如果要执行此操作,则需要启用 CGLIB:

<aop:aspectj-autoproxy proxy-target-class="true" />

我个人发现这比文档表明的要挑剔一些,尽管如果所有的星星都正确对齐,它确实有效,但从设计的角度来看,它通常更容易 - 并且更可取 - 声明您对接口的 AOP 建议,如下所示。(请注意,您需要KlazzImplBeanFactory/获取您的实例ApplicationContext。)

public interface Klazz {
  ResponseObject doSomething(RequestObject request);
}

public class KlazzImpl implements Klazz {
  public ResponseObject doSomething(RequestObject request) {...}
}

此外,您对args表达式的使用有点偏离。请参阅以下内容:

@Aspect
public class UserExistsCheck {
  @Autowired
  private UserInformation userInformation;

  @Around("execution(* a.b.c.d.*.*(..)) && args(reqObj)")
  public Object checkUser(ProceedingJoinPoint pjp, a.b.c.d.RequestObject reqObj) throws Throwable {
      // ...
  }
}

这些更改应该可以完成工作。

于 2010-04-10T04:38:14.830 回答
1

自春季 3.1 添加@EnableAspectJAutoProxy(proxyTargetClass=true)到您的@Configuraiton

于 2012-08-28T11:05:33.127 回答