SpringMVC 어댑터 모드 코드 예
if(mappedHandler.getHandler() instanceof MultiActionController){
((MultiActionController)mappedHandler.getHandler()).xxx
}else if(mappedHandler.getHandler() instanceof XXX){
...
}else if(...){
...
}
이렇게 가정하면 만약에 우리가 HardController를 추가하면 코드에 if(mappedHandler.getHandler() instanceof HardController를 한 줄 추가해야 한다이런 형식은 프로그램을 유지하기 어렵고 디자인 모델의 개폐 원칙인 확장 개방, 수정 폐쇄에 위배된다.
따라서 Spring은 각 Controller에 대응하는 어댑터 구현 클래스를 정의합니다.
컨트롤러 대신 어댑터를 실행하는 방법이렇게 컨트롤러를 확장할 때 어댑터 클래스를 하나만 추가하면 SpringMVC의 확장을 완성할 수 있습니다. 정말 정교한 방법입니다!
쓸데없는 말은 하지 말고 코드를 붙여라. 똑똑히 보기 위해 스프링 MVC를 시뮬레이션하기 위해 직접 스프링 원본을 붙이면 관심사를 낮추기 쉽다.
// Adapter
public interface HandlerAdapter {
public Boolean supports(Object handler);
public void handle(Object handler);
}
// Controller
public interface Controller {
}
public class HttpController implements Controller{
public void doHttpHandler(){
System.out.println("http...");
}
}
public class SimpleController implements Controller{
public void doSimplerHandler(){
System.out.println("simple...");
}
}
public class AnnotationController implements Controller{
public void doAnnotationHandler(){
System.out.println("annotation...");
}
}
//
public class SimpleHandlerAdapter implements HandlerAdapter {
public void handle(Object handler) {
((SimpleController)handler).doSimplerHandler();
}
public Boolean supports(Object handler) {
return (handler instanceof SimpleController);
}
}
public class HttpHandlerAdapter implements HandlerAdapter {
public void handle(Object handler) {
((HttpController)handler).doHttpHandler();
}
public Boolean supports(Object handler) {
return (handler instanceof HttpController);
}
}
public class AnnotationHandlerAdapter implements HandlerAdapter {
public void handle(Object handler) {
((AnnotationController)handler).doAnnotationHandler();
}
public Boolean supports(Object handler) {
return (handler instanceof AnnotationController);
}
}
// DispatcherServlet
import java.util.ArrayList;
import java.util.List;
public class DispatchServlet {
public static List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();
public DispatchServlet(){
handlerAdapters.add(new AnnotationHandlerAdapter());
handlerAdapters.add(new HttpHandlerAdapter());
handlerAdapters.add(new SimpleHandlerAdapter());
}
public void doDispatch(){
// SpringMVC request handler , new , ,
// Controller,
// HttpController controller = new HttpController();
// AnnotationController controller = new AnnotationController();
SimpleController controller = new SimpleController();
//
HandlerAdapter adapter = getHandler(controller);
// controller
adapter.handle(controller);
}
public HandlerAdapter getHandler(Controller controller){
for (HandlerAdapter adapter: this.handlerAdapters){
if(adapter.supports(controller)){
return adapter;
}
}
return null;
}
public static void main(String[] args){
new DispatchServlet().doDispatch();
}
}
이 모델을 통해 개원 코드의 정교함을 알 수 있다. 우리는 프레임워크 원본을 볼 때 목표가 있어야 한다. 그러면 자신이 배워야 할 것을 많이 찾을 수 있다. 현재 원본을 분석하는 댓글은 대부분 what, how를 설명한다.이것 으로 벽돌 을 던져 옥을 끌어올리는 것 을 여러분은 함께 "why"에 대해 토론하길 바랍니다
총결산
다음은 본고의 SpringMVC 어댑터 모드 코드 예시에 관한 모든 내용입니다. 여러분께 도움이 되기를 바랍니다.관심 있는 친구는 본 사이트의 다른 관련 주제를 계속 참고할 수 있습니다. 부족한 점이 있으면 댓글로 지적해 주십시오.여러분의 본 사이트에 대한 지지에 감사 드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
springmvc application/octet-stream problemmistake: Source code: Solution: Summarize: application/octet-stream is the original binary stream method. If the convers...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.