스프링 소스 노트

37663 단어 원본 노트
스프링 소스 노트
1. Spring MVC 프로 세 스 초기 화
1.1 프로필 doLoadConfig 불 러 오기 (config. getInitParameter ("contextConfigLocation")
Properties 를 불 러 오 는 것 이 상대 적 으로 간단 하 다 면 XML 은 복잡 하 게 해석 해 야 합 니 다.
Properties properties = new Properties();
//   web.xml    application.properties   ,      
InputStream is = this.getClass().getClassLoader().getResourceAsStream(String location);
properties.load(is);
//  ,         properties 

1.2 설정 파일 에 따라 모든 관련 클래스 doScanner (p. getProperty ("scanPackage") 를 검색 합 니 다.
List classNames = new ArrayList<>();
//      
URL url = this.getClass().getClassLoader().getResource("/"+packageName.replaceAll("\\.","/"));
File classDir = new File(url.getFile());
for(File file : classDir.listFiles()){
	if(file.isDirectory()){
		doScanner(packageName + "." + file.getName());
	}else{
        String className = packageName + "." + file.getName().replace(".class","");
        classNames.add(className);
 }
}


1.3 관련 클래스 의 인 스 턴 스 를 초기 화하 고 IOC 용기, 즉 MAP 의 doInstance () 에 넣 습 니 다.
private Map<String, Object> ioc = new HashMap<String, Object>();
//IOC  
if(classNames.isEmpty()){
	return;
}
for(String className : classNames){
	Class<?> clazz = class.forName(className);
}

/**
*   IOC             
*IOC    
*1.key          
*2.       ,           
*3.       ,             key
*/
if(clazz.isAnnotationPresent(Controller.class)){
    //simpleName   ,      。      +32    
    String beanName = lowerFirstCase(clazz.getSimpleName());
}else if(clazz.isAnnotationPresent(Service.class)){
    //2.       ,           
    Service service = clazz.getAnnotation(Service.class);
    String beanName = service.value();
    if("".equals(beanName.trim())){
        beanName =  lowerFirstCase(clazz.getSimpleName());
    }
    Object instance = clazz.newInstance();
    ioc.put(beanName,instance);
    //3.       ,             key
    Class<?>[] interfaces = clazz.getInterfaces();
    for(Class<?> i : interfaces){
        ioc.put(i.getName(),instance);
    }
    
    
}else{
    continue;
}

1.4 자동 의존 주입 doAutowired () 실현
if(ioc.isEmpty()){
	return;
}
for(Map.Entry<String,Object> entry : ioc.entrySet()){
	//      field   private protected default     
	Field[] fields = entry.getValue().getClass().getDeclaredFields();
	for(Field field : fields){
	   if(!field.isAnnotationPresent(Autowried.class)){continue;};
        Autowried autowried = field.getAnnotation(Autowried.class);
        String beanName = autowried.value().trim();
        if("".equals(beanName)){
            beanName = field.getType().getName();
        }
        //      ,            
        field.setAccessible(true);
        //  :Object instance = entry.getValue(); field   set      ?
        //          ,        new      ,         。
        field.set(entry.getValue(),ioc.get(beanName));
		
	}
}

1.5 HandlerMapping initHanlerMapping () 초기 화
// private Map hanlderMapping = new HashMap();
//   :
private List<Handler> handlerMapping = new ArrayList<Handler>();
Handler   Method, pattern(  ),paramOrder,controller

if(ioc.isEmpty()){return;}
for(Map.Entry<String,Object> entry : ioc.entrySet()){
    Class<?> clazz = entry.getValue().getClass();
    if(!clazz.isAnnotationPresent(Controller.class)){
        continue;
    }
    String baseUrl = "";
    if(clazz.isAnnotationPresent(Controller.class)){
        RequestMapping requestMapping = clazz.getAnnotation(RequestMapping.class);
        baseUrl = requestMapping.value();
    }
    
    Method[] method = clazz.getMethod();
    for(Method method : methods){
        if(!method.isAnnotationPresent(RequestMapping.class)){
            continue;
        }
        RequestMapping requestMapping = method.getAnnotation(RequestMapping.class);
        /*
        //    /     
        String url = (baseUrl + requestMapping.value()).replaceAll("/+","/");
        handlerMapping.put(url,method);
        logger.info("Mapping:{},{}",url,method);
        */
        String regex = ("/"+baseUrl+requestMapping.value()).replaceAll("/+","");
        Pattern pattern = Pattern.compile(regex);
        handlerMapping.add(new Handler(pattern,entry.getVallue(),method));
        logger.info("mapping:{},{}",regex,method);

    }
    
}

1.6 doPost()
//          
/*
String url = req.getRequestURI();
String contextPath = req.getContextPath();
url = url.replace(contextPath,"").replaceAll("/+","");
if(!handlerMapping.containsKey(url)){
    resp.getWriter().writer("404 Not Found!");
}
Method m = handlerMapping.get(url);
*/
//   :
Handler handler = getHandler(req);
if(handler == null){
    resp.getWriter().writer("404 Not Found!");
    return;
}
//        
Class<?> [] paramTypes = handler.method.getParameterTypes();
//              
Object[] paramValues = new Object[paramTypes.length];
Map<String,String[]> params = req.getParameterMap();
for(Map.Entry<String,String[]> param : params.entrySet()){
    //        
    String value = Arrays.toString(param.getValue()).replaceAll("\\[|\\]","/");
    //         ,      
    if(!handler.paramIndexMapping.containsKey(param.getKey())){continue;}
    int index = handler.paramIndexMapping.get(param.getKey());
    paramValues[index] = convert(paramTypes[index], value);
        
}
//      request   response  
int reqIndex = handler.paramIndexMapping.get(HttpServletRequest.class.getName());
paramValue[reqIndex] = req;
int respIndex = handler.paramIndexMapping.get(HttpServletResponse.class.getName());
paramValue[respIndex] = req;

private Handler getHandler(HttpServletRequest req){
    if(handlerMapping.isEmpty()){return null;}
    String url = url.replace(contextPath,"").replaceAll("/+","");
    for(Handler handler : handlerMapping){
        Matcher matcher = handler.pattern.matcher(url);
        if(!matcher.matches()){continue;}
        return handler;
    }
    
}

좋은 웹페이지 즐겨찾기