spring 디자인 예쁘다: WebMvcConfigurer

WebMvcConfigure 에서 spring 디자인 의 맛 을 알 아 보 세 요.
  • 설명
  • WebMvcConfigure 가 무엇 입 니까
  • WebMvcConfigure 디자인 의 장점
  • 총화
  • 설명 하 다.
    이 글 은 주로 WebMvcConfigure 디자인 의 교묘 한 점 을 다 루 고 있다.목적 중 하나: WebMvcConfigure 가 무엇 인지 알 아 보 세 요.목적 2: WebMvcConfigure 디자인 의 장점
    WebMvcConfigure 가 뭐 예요?
    WebMvcConfigure 를 어떻게 사용 합 니까?
    @EnableWebMvc
    @Configuration
    public class WebConfiguration implements WebMvcConfigurer {
    
        @Override
        public void extendMessageConverters(List> converters) {
    
        }
    }
    

    이것 은 간단 한 실현 이다. spring 4.0 이전에 우 리 는 WebMvcConfigurerAdapter 를 원 했 지만 5.0 은 필요 없다.자바 8 인터페이스 새로운 기능: 1. default 기본 구현.2. static 기본 구현.즉, 우리 가 default 로 고 를 받 았 으 니 반드시 실현 할 필요 가 없다.WebMvcConfigurerAdapter 이것 은 바로 WebMvcConfigurer 인 터 페 이 스 를 보호 형식 으로 덮어 쓰 는 것 입 니 다. 우 리 는 WebMvcConfigurerAdapter 를 실현 하기 위해 모든 인터페이스 방법 을 실현 할 필요 가 없습니다.
    WebMvcConfigure 가 뭐 예요?우리 가 간단하게 이해 하 는 것 은 예전 에 우리 가 xml 로 설 정 했 을 때의 'spring - web. xml' 이다.바로 우 리 는 많은 웹 구성 요 소 를 설정 할 수 있 습 니 다. 예 를 들 어 메시지 전환, 차단기, 보기 변환기, 크로스 도 메 인 설정, 자원 컨트롤 러 등 입 니 다.우 리 는 인터페이스의 주석 설명 만 볼 필요 가 있다.
    우 리 는 spring 소스 코드 를 볼 때 주 해 를 보 았 습 니 다. 점 만 찍 으 면 해당 하 는 처리 방법 이 있 습 니 다. @EnableWebMvc 발견 Import (Delegating WebMvcConfiguration. class) 즉 Delegating WebMvcConfiguration 이 설정 가 져 오기
    public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport
    public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware 
    

    Delegating WebMvcConfiguration: 주로 Spring 용기 에 몇 개의 WebMvcConfiguration 이 있 는 지 검사 한 다음 에 넣 습 니 다.그리고 여러 가지 방법 이 있 습 니 다.WebMvcConfigurationSupport 는 우리 웹 구성 요소 의 초기 화 를 위 한 것 입 니 다. 예 를 들 어 Handler Mapping, Request Mapping Handler Adapter, Request Mapping Handler Mapping 등 입 니 다.
    여기 서 WebMvcConfigure 를 어떻게 사용 하 는 지 알 게 되 었 습 니 다.
    WebMvcConfigure 디자인 의 장점
    구상: 만약 당신 이 스스로 설계 하 라 고 한다 면, 예 를 들 어 내 가 메시지 변환 기 를 확장 하려 고 한다 면, 지금 우 리 는 Request Mapping Handler Adapter. getDefault Argument Resolvers 에서 알 게 되 었 습 니 다.
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), this.requestResponseBodyAdvice));
    		resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), this.requestResponseBodyAdvice));
    
    	public List> getMessageConverters() {
    		return this.messageConverters;
    	}
    

    。Request Mapping Handler Adapter. getMessage Converters 가 메시지 컨버터 를 얻 었 다 는 것 을 알 게 되 었 습 니 다. 우 리 는 지금 방법 을 강구 하여 message Converters 로 확장 하면 됩 니 다.
    디자인 사상: 1. 개방 폐쇄 원칙.2. 인터페이스 프로 그래 밍.
    1. 인 터 페 이 스 를 써 야 합 니 다. 이 인 터 페 이 스 는 기본 적 인 방법 인 setMessage Converters 가 있 습 니 다. 2. 이 인 터 페 이 스 를 확장 하여 A 를 설정 합 니 다.3. Request Mapping HandlerAdapter 는 setMessage Converters 일 때 템 플 릿 방법 을 호출 하거나 모든 A 설정 을 수집 하여 message Converters 에 넣 으 면 됩 니 다.여기 서 우리 가 고려 해 야 할 몇 가지 문제: 1. 기본 메시지 컨버터 는 어떻게 합 니까?2. 이 설정 이 없 으 면 어떻게 처리 합 니까?
    스프링 이 어떻게 하 는 지 봅 시다.
    @Configuration
    public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
    
    	private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
    
    
    	@Autowired(required = false)
    	public void setConfigurers(List configurers) {
    		if (!CollectionUtils.isEmpty(configurers)) {
    			this.configurers.addWebMvcConfigurers(configurers);
    		}
    	}
    
    
    	@Override
    	protected void configurePathMatch(PathMatchConfigurer configurer) {
    		this.configurers.configurePathMatch(configurer);
    	}
    
    	@Override
    	protected void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    		this.configurers.configureContentNegotiation(configurer);
    	}
    
    	@Override
    	protected void configureAsyncSupport(AsyncSupportConfigurer configurer) {
    		this.configurers.configureAsyncSupport(configurer);
    	}
    
    	@Override
    	protected void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    		this.configurers.configureDefaultServletHandling(configurer);
    	}
    
    

    WebMvcConfigurer Composite 는 무엇 입 니까?
    class WebMvcConfigurerComposite implements WebMvcConfigurer {
    
    	private final List delegates = new ArrayList<>();
    
    
    	public void addWebMvcConfigurers(List configurers) {
    		if (!CollectionUtils.isEmpty(configurers)) {
    			this.delegates.addAll(configurers);
    		}
    	}
    
    
    	@Override
    	public void configurePathMatch(PathMatchConfigurer configurer) {
    		for (WebMvcConfigurer delegate : this.delegates) {
    			delegate.configurePathMatch(configurer);
    		}
    	}
    
    

    말 그대로 WebMvcConfigurer 에이전트 입 니 다. 저희 가 설정 한 WebMvcConfigurer 는 모두 WebMvcConfigurer Composite 에 추 가 됩 니 다.
    Delegating WebMvcConfiguration 의 다른 설정 방법 은 모두 WebMvcConfiguration Support 의 템 플 릿 방법 입 니 다.
    RequestMappingHandlerAdapter 가 메시지 변환 기 를 어떻게 불 러 오 는 지 보 려 면:
    	protected final List> getMessageConverters() {
    		if (this.messageConverters == null) {
    			this.messageConverters = new ArrayList<>();
    			configureMessageConverters(this.messageConverters);
    			if (this.messageConverters.isEmpty()) {
    				addDefaultHttpMessageConverters(this.messageConverters);
    			}
    			extendMessageConverters(this.messageConverters);
    		}
    		return this.messageConverters;
    	}
    protected void extendMessageConverters(List> converters) {
    	}
    

    먼저 메시지 변환기 가 설정 되 어 있 는 지 확인 하고 설정 되 어 있 지 않 으 면 기본 값 을 불 러 옵 니 다. 확장 되 어 있 는 메시지 변환기 가 있 는 지 확인 하 십시오. 여 기 는 모두 템 플 릿 방법 입 니 다. 모두 Delegating WebMvcConfiguration 에서 만 들 었 습 니 다.
    저 는 그때 한 가지 문 제 를 생각 하고 있 었 습 니 다. Delegating WebMvcConfiguration 은 실현 할 수 있 지 않 습 니까? 왜 WebMvcConfigurer Composite 를 해 야 합 니까?Delegating WebMvcConfiguration 은 WebMvcConfigurerComposite 를 사용 하지 않 고 List 를 직접 사용 합 니 다. 왜 그 러 세 요?
    이 가능 하 다, ~ 할 수 있다,...
    물론 제 가 디자인 하면 WebMvcConfigurer Composite 를 사용 하지 않 아 도 될 것 같 습 니 다.
    총결산
    1. WebMvcConfigure 는 웹 요청 과정 에서 의 구성 을 설정 하 는 것 입 니 다.2. 자바 8 인 터 페 이 스 는 default 을 사용 할 수도 있 고 static 방법 을 사용 할 수도 있 습 니 다.3. 인터페이스 프로 그래 밍, 템 플 릿 방법.

    좋은 웹페이지 즐겨찾기