仅使用注解的 Spring AOP 拦截方法 [英] Intercepting method with Spring AOP using only annotations
问题描述
在我的 Spring 上下文文件中,我有这样的内容:
In my Spring context file I have something like this:
<bean id="userCheck" class="a.b.c.UserExistsCheck"/>
<aop:config>
<aop:aspect ref="userCheck">
<aop:pointcut id="checkUser"
expression="execution(* a.b.c.d.*.*(..)) && args(a.b.c.d.RequestObject)"/>
<aop:around pointcut-ref="checkUser" method="checkUser"/>
</aop:aspect>
</aop:config>
a.b.c.UserExistsCheck 看起来像这样:
a.b.c.UserExistsCheck looks like this:
@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);
}
}
被这个东西拦截的类是这样的:
And the class that is being intercepted with this stuff looks like this:
public class Klazz {
public ResponseObject doSomething(RequestObject request) {...}
}
这有效.UserExistCheck 在调用传递给 Klazz 之前根据需要执行.问题是这是我让它工作的唯一方法.通过使用注释而不是上下文文件来实现这一点对我的小脑袋来说似乎太过分了.那么......我应该如何准确地注释 UserExistsCheck 和 Klazz 中的方法?我还需要别的东西吗?又一个班?上下文文件中还有一些东西吗?
This works. UserExistCheck is executed as desired before the call is passed to Klazz. The problem is that this is the only way I got it working. To get this working by using annotations instead of the context file seems to be just too much for my small brain. So... how exactly should I annotate the methods in UserExistsCheck and Klazz? And do I still need something else too? Another class? Still something in the context file?
推荐答案
您是否启用了基于注解的 AOP?文档 说你必须添加
Have you enabled annotation-based AOP? The documentation says you have to add
<aop:aspectj-autoproxy/>
到您的弹簧配置.然后你需要在你的 checkUser
方法前面添加一个注解.看起来你想要 @Around
建议,如 此处.
to your spring configuration. Then you need to add an annotation in front of your checkUser
method. It looks like you want @Around
advice, as described here.
@Aspect
public class UserExistsCheck {
@Around("execution(* a.b.c.d.*.*(..)) && args(a.b.c.d.RequestObject)")
public Object checkUser(ProceedingJoinPoint pjp) throws Throwable {
这篇关于仅使用注解的 Spring AOP 拦截方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!