# deploy **Repository Path**: hctrl/deploy ## Basic Information - **Project Name**: deploy - **Description**: 项目架构 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-09-15 - **Last Updated**: 2023-09-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 静态资源访问 ## 静态资源目录 只要静态资源放在类路径下 : /static, /public, resources, /META-INF/resources > 访问 : localhost:8080/ + 静态资源名 原理 : 静态映射/** 请求进来, 先去找controller看是否可以处理, 不能处理的所有请求都交给静态资源处理器, 静态资源也找不到 报404 修改静态资源目录: spring.mvc.static-path-pattern: /res/** > 访问 : localhost:8080/ + res/ + 静态资源名 修改静态路径: > spring.web.resources.static-locations: classpath:/haha/ ## 欢迎页面支持 ### 配置欢迎页面的两种方法 : * 静态资源路径下创建index.html > * 可以配置静态资源路径 * 但是不能配置静态资源的访问前缀, 否则导致index.html不能被默认访问 * controller处理/index请求 ## 自定义favicon > 在静态资源路径下添加一个favicon.ico文件即可 # spingmvc 流程 > 1. DispatcherServlet类下的doDispatch方法 2. 获取对应的mappedHandler (mappedHandler = this.getHandler(processedRequest);) 3. 根据mappedHandler获取对应的HandlerAdapter(HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());) HandlerAdapter有五个实现类, 通常使用httpRequestHandlerAdapter 4. mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); 获取modelandview对象 5. 进入4中的方法, 进入handleInternal方法, 在进入this.invokeHandlerMethod(request, response, handlerMethod); 6. 构造invocableMethod对象, 调用invocableMethod.invokeAndHandle(webRequest, mavContainer, new Object[0]);方法 7. 进入6, 调用this.invokeForRequest(webRequest, mavContainer, providedArgs); 这个方法执行结束, 接口执行结束, 方法的结果是接口的返回值 8. 进入7, 调用this.getMethodArgumentValues(request, mavContainer, providedArgs);, 返回全部的参数 9. 进入8, 调用args[i] = this.resolvers.resolveArgument(parameter, mavContainer, request, this.dataBinderFactory); 10. 进入9, 调用this.getArgumentResolver(parameter); 获取参数解析器HandlerMethodArgumentResolver, 一共有27种 11. 调用resolver.resolveArgument(parameter, mavContainer, webRequest, binderFactory); 返回参数 12. 8执行结束, 调用this.doInvoke(args); 里面有反射调用自己写的接口 13. 12结束, 从7出来, 执行this.setResponseStatus(webRequest); 封装返回值 # @Autowired与@Resource的区别 * @Autowired注解查找bean的流程 > * 首先通过type去查找注入到容器中的bean * 如果存在多个, 判断哪个bean上存在@Primary注解, 存在就使用这个bean * 如果没有注解, 会根据name查找bean * 如果查找到唯一的bean则赋值, 如果没有查找到, 且存在多个type相同的bean, 则会报错, 项目无法启动 * @Resource注解查找bean的流程 > * @Resource注解有一个name属性, 如果填写了, 先根据name的值去查找 * 如果没有填写, 首先通过name去查找 * 如果没有找到, 在根据type去查找 * 如果根据type查找到多个, 则项目启动会报错