代码之家  ›  专栏  ›  技术社区  ›  fish

只使用注释的spring aop截取方法

  •  3
  • fish  · 技术社区  · 16 年前

    在我的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>    
    

    a.b.c.userexistscheck如下所示:

    @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中的方法?我还需要别的东西吗?另一个班?上下文文件里还有什么东西吗?

    3 回复  |  直到 14 年前
        1
  •  5
  •   John    16 年前

    是否已启用基于批注的AOP?这个 documentation 说你必须加上

    <aop:aspectj-autoproxy/>
    

    你的弹簧配置。然后需要在 checkUser 方法。看起来你想要 @Around 建议,如前所述 here .

    @Aspect
    public class UserExistsCheck {
    
      @Around("execution(* a.b.c.d.*.*(..)) && args(a.b.c.d.RequestObject)")
      public Object checkUser(ProceedingJoinPoint pjp) throws Throwable {
    
        2
  •  3
  •   Community Mohan Dere    14 年前

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

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

    我个人认为,这比文档中指出的应该更挑剔一些,虽然如果所有的星都正确对齐,它确实可以工作,但从设计的角度来看,在接口上声明您的aop建议通常更容易,而且更可取,如下所示。(注意,您需要获取 KlazzImpl 从你 BeanFactory / 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 {
          // ...
      }
    }
    

    这些变化应该起作用。

        3
  •  1
  •   Ivan Velykorodnyy    14 年前

    从春季3.1开始添加 @EnableAspectJAutoProxy(proxyTargetClass=true) 对你 @Configuraiton