2010-04-10 54 views
3

在我的Spring上下文文件的拦截方法,我有这样的事情:使用Spring AOP的唯一注解

<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) {...} 
} 

This works。在呼叫传递给Klazz之前,UserExistCheck会根据需要执行。问题是,这是我得到它的唯一方法。通过使用注释而不是上下文文件来实现这个工作似乎对我的小脑袋来说太过分了。那么......我应该如何在UserExistsCheck和Klazz中注释这些方法?我还需要别的东西吗?另一类?仍然在上下文文件中的东西?

回答

5

您是否启用了基于注释的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 { 
+0

是的,我已经启用。我也试过这个,但是不起作用,checkUser方法从来没有被调用:( – fish 2010-04-10 03:36:10

+0

其实这个_did_工作,我刚刚在args中有一个愚蠢的错误,谢谢!现在我想知道我在尝试上下文之前做了什么错误文件的方法... – fish 2010-04-10 05:43:23

+0

+1感谢 - 正是我想要的 – andyb 2011-05-26 10:24:31

3

从您提供的示例代码看来,您似乎正在尝试为没有实现任何接口的类创建通知。作为弹性文档的​​节所述,如果你要做到这一点,你需要使CGLIB:

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

,我个人认为这是一个有点比文档更挑剔表明它应该是这样的,尽管如果所有的星星都是正确对齐的,它确实有效,但从设计角度来看,通常更容易在接口上声明您的AOP建议,如下所示。 (请注意,您需要在您的BeanFactory/ApplicationContext获得您的KlazzImpl实例。)

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 { 
     // ... 
    } 
} 

这些更改应该可以完成这项工作。从开始:

+0

感谢您的提示,实际上Klazz确实实现了一个接口,但我使用Spring自动装配来创建实例,对不起,我没有通知这是不相关的。无论如何,所有的信息是有用的,谢谢! – fish 2010-04-10 05:46:32

1

春季以来3.1添加@EnableAspectJAutoProxy(proxyTargetClass=true)@Configuraiton