스프링 소스 노트
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;
}
}