[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.내가 아는 한, XML없이 Spring MVC 인터셉터를 설정하는 방법은 없다.
내가 아는 한, XML없이 Spring MVC 인터셉터를 설정하는 방법은 없다.
그러나 Spring 3.0.x가 아닌 최신 버전의 mvc 네임 스페이스에는 몇 가지 단순화가 있습니다.
<mvc:interceptors> <bean class="com.vaannila.interceptor.LoggerInterceptor" /> </mvc:interceptors>
참조 :
-
==============================
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.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.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.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; } }
from https://stackoverflow.com/questions/4389224/is-it-possible-to-wire-a-spring-mvc-interceptor-using-annotations by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring에서 트랜잭션을 사용할 때 포스트 커밋 만들기 (0) | 2019.01.29 |
---|---|
[SPRING] 클래스 패스에있는 jar 파일 안에있는 스프링 애플리케이션 컨텍스트 파일로드하기 (0) | 2019.01.29 |
[SPRING] 예상 CSRF 토큰을 찾을 수 없습니다. 세션이 만료되었습니다. 403 (0) | 2019.01.29 |
[SPRING] 어떻게 thymeleaf th : 다른 변수에서 필드 값을 설정하는 방법 (0) | 2019.01.29 |
[SPRING] 스프링 MVC 검사기 주석 + 사용자 정의 유효성 검사 (0) | 2019.01.29 |