【问题标题】:Invoking custom annotation using Spring AOP使用 Spring AOP 调用自定义注解
【发布时间】:2014-09-28 09:25:17
【问题描述】:

我在网上搜索了一个关于如何使用 Spring AOP 调用我的自定义方法注释的明确示例,但找不到明确的示例。

我正在构建一个框架,以便在调用任何 POJO 上的某些方法时在上下文中注入用户配置文件。

应通过自定义方法注释调用框架 API,例如 @RunAsAdmin。我可以构建注释部分和解析器,我的问题是在调用带注释的方法时调用解析器的最佳方式是什么。

我们正在使用 Spring 3.0,并且想知道配置 Spring 框架以理解那些使用特定注释注释的方法并调用我的注释处理程序(解析器)的最佳实践。

任何示例或指导都将受到高度赞赏。

【问题讨论】:

    标签: spring annotations aspectj spring-aop


    【解决方案1】:

    拦截对任何带注释的 Spring bean 方法的调用很简单,请参见下面的示例。
    根据定义,拦截 POJO 上的调用是不可能的 - 您必须返回一个代理。
    也就是说,您应该为这些 POJO 实现一个工厂,该工厂将返回代理而不是真正的 POJO。您可以为此使用 ProxyFactoryBean http://docs.spring.io/autorepo/docs/spring-framework/3.2.0.BUILD-SNAPSHOT/api/org/springframework/aop/framework/ProxyFactoryBean.html

    //intercepting a call to any method annotated with @com.yours.RunAsAdmin of any Spring-managed bean
    @Component @Aspect class RunAsAdminAspect {
        @Autowired 
        private YourRunAsAdminHandler handler;
    
        @Before("@annotation(com.yours.RunAsAdmin)")
        public void doRunAsAdmin() {
            handler.grantAdminRightsToCurrentUser(); //your real stuff
        } 
    }
    

    【讨论】:

    • 感谢 Alex,将使用您的示例使用 Spring 托管 bean。什么应该进入我的 Spring 上下文配置?这就是我需要添加的全部内容:<aop:aspectj-autoproxy/>
    • 在doRunAsAdmin方法中,是否可以获取即将调用哪个方法的句柄?
    • 您只需要更改诸如 public void doRunAsAdmin(JoinPoint joinpoint) 之类的方法,而不是在其中您可以获取调用的方法,例如 MethodSignature signature = (MethodSignature) joinPoint.getSignature();方法method = signature.getMethod();
    • 感谢 varun,补充了答案!
    猜你喜欢
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    相关资源
    最近更新 更多