0

我使用了一个自定义注释

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping .

它工作正常,有时它看起来很昂贵,因为所有方法调用,控制权转到 Annotation 实现类。我希望控件仅针对已声明自定义注释的那些方法转到实现类。有人可以告诉我如何实现这一目标。 我已经做到了如下。

在 web.xml 中:-

<context-param>
 <param-name>contextClass</param-name>
 <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>

在 controller.xml 中:-

<bean id="myInterceptor" class="com.common.annotation.MyInterceptor"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">  
 <property name="interceptors">  
    <list>  
         <ref bean="myInterceptor"/>  
     </list>  
 </property>  
</bean> 

在注释类中: -

@Target({ElementType.METHOD,ElementType.ANNOTATION_TYPE})  
@Retention(RetentionPolicy.RUNTIME)  
public @interface MyAnnotation {  
        boolean checkAuth() default true;  
    } 

将其用作:-

@RequestMapping(value = "/user", method = RequestMethod.GET)
    @MyAnnotation(checkAuth=true)
    public ModelAndView forUser() {........

有人可以建议。

4

1 回答 1

0

您确实有 2 个选项可以以通用方式实现此功能:

  1. 拦截器
  2. AOP

使用 AOP,您可以使用指定注释的切入点,并创建包含您的逻辑的建议。如果您使用 Spring AOP,这将仅扩展带注释的方法。

像这样的东西:

@Aspect
class MyAnnotationAspect {
    @Around(value="@annotation(org.sample.MyAnnotation)")
    public Object display(ProceedingJoinPoint joinPoint, MyAnnotation myAnnotation ) throws Throwable {
        if(myAnnotation.checkUser()) {
            // Auth logic goes here
        }
    }
}
于 2013-01-12T19:23:51.353 回答