복붙노트

[SPRING] 주석을 사용하여 Spring MVC 인터셉터를 연결하는 것이 가능한가?

SPRING

주석을 사용하여 Spring MVC 인터셉터를 연결하는 것이 가능한가?

어노테이션을 사용하여 Spring MVC 인터셉터를 연결하는 것이 가능한가? 그렇다면 누군가가 어떻게 그렇게 할 수 있는지에 대한 예제를 제공 할 수 있을까?

어노테이션을 통해 와이어를 통해 가능한 한 XML 구성을 거의 수행하지 않는 것에 대해 언급하고 있습니다. 예를 들어이 구성 파일에서 나는 http://www.vaannila.com/spring/spring-interceptors.html에서 찾았습니다.

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" p:interceptors-ref="loggerInterceptor" />
<bean id="loggerInterceptor" class="com.vaannila.interceptor.LoggerInterceptor" />

얼마나 적은 구성으로 도망 갈 수 있습니까? @Autowired가 2 행에서 빈을 명시 적으로 선언 할 필요를 없애 겠지만 1 행을 주석으로 제거하는 것이 가능 할까?

해결법

  1. ==============================

    1.내가 아는 한, XML없이 Spring MVC 인터셉터를 설정하는 방법은 없다.

    내가 아는 한, XML없이 Spring MVC 인터셉터를 설정하는 방법은 없다.

    그러나 Spring 3.0.x가 아닌 최신 버전의 mvc 네임 스페이스에는 몇 가지 단순화가 있습니다.

    <mvc:interceptors>
        <bean class="com.vaannila.interceptor.LoggerInterceptor" />
    </mvc:interceptors>
    

    참조 :

  2. ==============================

    2.이 문제를 정확히 조사하는 중에 우연히 만났습니다. 마지막으로 WebMvcConfigurerAdapter와 함께 @EnableWebMVC를 사용하여 Spring 3.1에서 작동한다는 것을 알게되었습니다.

    이 문제를 정확히 조사하는 중에 우연히 만났습니다. 마지막으로 WebMvcConfigurerAdapter와 함께 @EnableWebMVC를 사용하여 Spring 3.1에서 작동한다는 것을 알게되었습니다.

    간단한 예 :

    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages="webapp.base.package")
    public class WebApplicationConfig extends WebMvcConfigurerAdapter {
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new LoggerInterceptor());
        }
    
    }
    
  3. ==============================

    3.Spring의 @Controller 어노테이션의 정신으로 커스텀 @Interceptor 어노테이션을 사용하여 작업 솔루션을 구현했다.

    Spring의 @Controller 어노테이션의 정신으로 커스텀 @Interceptor 어노테이션을 사용하여 작업 솔루션을 구현했다.

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE})
    @Documented
    @Component
    public @interface Interceptor {
      String[] pathPatterns() default {};
      String[] excludePathPatterns() default {};
    }
    

    이 주석은 다음과 같이 HandlerInterceptor 유형에 적용되어야합니다.

    @Interceptor
    public class BuildTimestampInterceptor extends HandlerInterceptorAdapter {
      private final String buildTimestamp;
    
      public BuildTimestampInterceptor(@Value("${build.timestamp}") String buildTimestamp) {
        this.buildTimestamp = buildTimestamp;
      }
    
      @Override
      public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {
        req.setAttribute("buildTimestamp", buildTimestamp);
        return true;
      }
    }
    

    마지막으로, 프로세서 클래스 인 InterceptorProcessor는 WebMvcConfigurerAdapter를 확장하고 BeanPostProcessor를 구현하여 커스텀 @Interceptor 어노테이션을 스캔하고 오버 라이딩 된 addInterceptors 메소드 내에서 그 앤티 앨리어스를 가진 Bean을 HandlerInterceptors로 등록하는 Spring 빈이다.

    @Component
    public class InterceptorProcessor extends WebMvcConfigurerAdapter implements BeanPostProcessor {
      private final Map<HandlerInterceptor,Interceptor> interceptors = new HashMap<>();
    
      @Override
      public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        scanForInterceptorAnnotation(bean, beanName);
        return bean;
      }
    
      @Override
      public Object postProcessAfterInitialization(Object bean, String string) throws BeansException {
        return bean;
      }
    
      protected void scanForInterceptorAnnotation(Object bean, String beanName) {
        Optional<Interceptor> optionalInterceptor = getInterceptorAnnotation(bean.getClass());
        if (optionalInterceptor.isPresent() && bean instanceof HandlerInterceptor) {
          interceptors.put((HandlerInterceptor) bean, optionalInterceptor.get());
        }
      }
    
      private Optional<Interceptor> getInterceptorAnnotation(Class cls) {
        Annotation[] annotations = cls.getAnnotationsByType(Interceptor.class);
        if (hasValue(annotations)) {
          return Optional.of((Interceptor) annotations[0]);
        }
        return Optional.empty();
      }
    
      @Override
      public void addInterceptors(InterceptorRegistry registry) {
        interceptors.forEach((HandlerInterceptor key, Interceptor val) -> {
          InterceptorRegistration registration = registry.addInterceptor(key);
          if (hasValue(val.pathPatterns())) {
            registration.addPathPatterns(val.pathPatterns());
          }
    
          if (hasValue(val.excludePathPatterns())) {
            registration.excludePathPatterns(val.excludePathPatterns());
          }
        });
      }
    
      private static <T> boolean hasValue(T[] array) {
        return array != null && array.length > 0;
      }
    }
    

    스프링 애플리케이션이이 프로세서 빈을 스캔하여 실제로 @Interceptors를 등록하게하는 것을 잊지 마십시오. 같은 것 :

    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages = {"org.my.controller", "org.my.utils.processor"})
    public class WebConfig extends WebMvcConfigurerAdapter {...
    
  4. ==============================

    4.Spring AOP에 대해서는 잘 모릅니다. 그러나 Spring을 통해 AspectJ를 사용한다면 @Aspect, @Pointcut, @Advise 등을 사용할 수 있습니다.

    Spring AOP에 대해서는 잘 모릅니다. 그러나 Spring을 통해 AspectJ를 사용한다면 @Aspect, @Pointcut, @Advise 등을 사용할 수 있습니다.

    Spring AOP와 함께이 주석을 사용하는 하우투에 대한 훌륭한 기사도있다. http://java-x.blogspot.com/2009/07/spring-aop-with-aspecj-annotations.html

  5. ==============================

    5.Markus Kreusch'answers와 마찬가지로, 이것 역시 이와 같이 작동 할 수 있습니다.

    Markus Kreusch'answers와 마찬가지로, 이것 역시 이와 같이 작동 할 수 있습니다.

    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages="webapp.base.package")
    public class WebApplicationConfig extends WebMvcConfigurerAdapter {
    
        @Override
        public RequestMappingHandlerMapping requestMappingHandlerMapping() {
            RequestMappingHandlerMapping RequestMappingHandlerMapping=  super.requestMappingHandlerMapping();
            Object[] interceptors = new Object[1];
            interceptors[0] = new RoleInterceptor();
            RequestMappingHandlerMapping.setInterceptors(interceptors);
            return RequestMappingHandlerMapping;
        }
    
    }
    
  6. from https://stackoverflow.com/questions/4389224/is-it-possible-to-wire-a-spring-mvc-interceptor-using-annotations by cc-by-sa and MIT license