首页
沸点
课程
数据标注
HOT
AI Coding
更多
直播
活动
APP
插件
直播
活动
APP
插件
搜索历史
清空
创作者中心
写文章
发沸点
写笔记
写代码
草稿箱
创作灵感
查看更多
登录
注册
确定删除此收藏集吗
删除后此收藏集将被移除
取消
确定删除
确定删除此文章吗
删除后此文章将被从当前收藏集中移除
取消
确定删除
编辑收藏集
名称:
描述:
0
/100
公开
当其他人关注此收藏集后不可再更改为隐私
隐私
仅自己可见此收藏集
取消
确定
服务器端
订阅
vfan140
更多收藏集
微信扫码分享
微信
新浪微博
QQ
16篇文章 · 0订阅
从美团这篇文章聊聊微前端的聚合问题
如果大家听说过“微服务(Microservices)”的概念的话就不难理解“微前端(Micro Frontends)”。和后端应用类似,当一个前端应用变得异常庞大以后,它会变得难以维护,同时也会变得不稳定。将大的应用拆分为小的应用能够让每个专业团队专心负责自己的功能,更易于测试…
java8新特性~终结版
1.简介毫无疑问,Java8是Java自Java5(发布于2004年)之后的最重要的版本。这个版本包含语言、编译器、库、工具和JVM等方面的十多个新特性。在本文中我们将学习这些新特性,并用实际的例子说
69 个经典 Spring 面试题和答案
也可以说是 Spring 的知识总结了。
四张图带你了解Tomcat系统架构--让面试官颤抖的Tomcat回答系列!
俗话说,站在巨人的肩膀上看世界,一般学习的时候也是先总览一下整体,然后逐个部分个个击破,最后形成思路,了解具体细节,Tomcat的结构很复杂,但是 Tomcat 非常的模块化,找到了 Tomcat最核心的模块,问题才可以游刃而解,了解了Tomcat的整体架构对以后深入了解Tom…
Spring MVC 容器那点事
## SpringMVC 容器 之前分析了过 Spring 的启动过程了,今天看下 SpringMVC 的启动。一样的,我们先看下 web.xml,SpringMVC 是以 Servlet 配置出现的 ``` <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring-application.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> ``` 之前分析了 ContextLoaderListener,实例化 IoC 容器,并将此容器实例注册到 ServletContext 中。我们先看下 DispatcherServlet 的类图及继承关系: <div align="center"> <img src="https://github.com/Jimmy2Angel/jimmy2angel.github.io/blob/master/img/SpringMVC/DispatcherServletClass.png?raw=true"/> </div> SpringMVC 最核心的类就是 DispatcherServlet, 关于 Spring Context 的配置文件加载和创建是在 init() 方法中进行的,主要的调用顺序是 init-->initServletBean-->initWebApplicationContext 。 先来看一下 initWebApplicationContext 的实现:FrameworkServlet.java <div align="center"> <img src="https://github.com/Jimmy2Angel/jimmy2angel.github.io/blob/master/img/SpringMVC/initWebApplicationContext1.png?raw=true"/> <img src="https://github.com/Jimmy2Angel/jimmy2angel.github.io/blob/master/img/SpringMVC/initWebApplicationContext2.png?raw=true"/> </div> 先简单说下这些代码的功能: 514 行:从 ServletContext 中获取 rootContext 也就是 SpringIOC 容器 517 行:如果一个 context 的实例被注入了,直接使用 538 行:从 ServletContext 中获取 webApplicationContext 也就是 SpringMVC 容器 543 行:创建 SpringMVC 的容器,并将 rootContext 作为父容器 550 行:刷新上下文(执行组件的初始化),这个方法由子类 DispatchServlet 的方法实现 556 行:将 SpringMVC 容器作为属性设置进 ServletContext 这里多说一句,SpringMVC 容器在 ServletContext 中的属性名: ``` public String getServletContextAttributeName() { return SERVLET_CONTEXT_PREFIX + getServletName(); } public static final String SERVLET_CONTEXT_PREFIX = FrameworkServlet.class.getName() + ".CONTEXT."; ``` 而 SpringIOC 容器在 ServletContext 中的属性名: ``` String ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() + ".ROOT"; ``` 前面的没什么好说的,我们看下 onRefresh() 方法,调用了 initStrategies() 方法: <div align="center"> <img src="https://github.com/Jimmy2Angel/jimmy2angel.github.io/blob/master/img/SpringMVC/DispatcherServlet-onRefresh.png?raw=true"/> </div> 执行 MVC 的相关组件的初始化,我们以 HandlerMappings 为例看来看下: <div align="center"> <img src="https://github.com/Jimmy2Angel/jimmy2angel.github.io/blob/master/img/SpringMVC/DispatcherServlet-initHandlerMappings.png?raw=true"/> </div> detectAllHandlerMappings 默认为 true,从当前的 SpringMVC 容器及其父容器中查找所有的 HandlerMappings,否则只从当前的 SpringMVC 容器中查找 HandlerMapping,如果没有找到 handlerMappings,设置默认的 handlerMapping,默认值设置在 DispatcherServlet 同级目录的 DispatcherServlet.properties 中。 ### 多说一句 上面的 findWebApplicationContext(),createWebApplicationContext(rootContext) 之类的方法点进去看看也很容易懂,我就不贴源码了,然后 createWebApplicationContext 中会层层调用直到 AbstractApplicationContext 的 refresh 方法来初始化 bean,这个方法在之前分析 Spring 启动的时候看过,这里也就不看了。 还是那句话,以我现在水平分析源码并不指望能看懂并理解每一句每一行,但是看不懂的方法你就点进去看看,万一里面里面的东西你看过呢是不是,就怕看不懂然后觉得这行代码不重要就不看了。 嗯?说完了?怎么感觉看完之前的 [Spring 容器那点事](https://jimmy2angel.github.io/2017/05/31/SpringIOC/),再看这个好像也没什么了。我们再来简单说下 Spring 容器和 SpringMVC 容器的 py(手动滑稽) 关系。 ## Spring 容器 和 SpringMVC 容器的关系 ContextLoaderListener 中创建 ApplicationContext(SpringIOC 容器)主要用于整个 Web 应用程序需要共享的一些组件 ,比如 DAO,数据库的 ConnectionFactory 等。而由 DispatcherServlet 创建的 ApplicationContext(SpringMVC 容器)主要用于和该 Servlet 相关的一些组件 ,比如 Controller、ViewResovler 等。 对于作用范围而言, 在 DispatcherServlet 中可以引用由 ContextLoaderListener 所创建的 ApplicationContext ,而反过来不行。 在 Spring 的具体实现上,这两个 ApplicationContext 都是通过 ServletContext 的 setAttribute 方法放到 ServletContext 中的。但是, ContextLoaderListener 会先于 DispatcherServlet 创建 ApplicationContext,DispatcherServlet 在创建 ApplicationContext 时会先找到由 ContextLoaderListener 所创建的 ApplicationContext,再将后者的 ApplicationContext 作为参数传给 DispatcherServlet 的 ApplicationContext 的 setParent() 方法, ``` wac.setParent(parent); ``` 其中, wac 即为由 DisptcherServlet 创建的 ApplicationContext,而 parent 则为 ContextLoaderListener 创建的 ApplicationContext 。此后,框架又会调用 ServletContext 的 setAttribute() 方法将 wac 加入到 ServletContext 中。 当 Spring 在执行 ApplicationContext 的 getBean 时, 如果在自己 context 中找不到对应的 bean,则会在父容器中去找 。这也解释了为什么我们可以在 DispatcherServlet 中获取到由 ContextLoaderListener 对应的 ApplicationContext 中的 bean。举个例子就是,你可以在 controller 层中注入 service 层的 bean。
Nginx配置浅析
Nginx配置浅析
Redis面试总结
Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。
使用Puppeteer轻松爬取网易云音乐、QQ音乐的精品歌单
最近在学习Puppeteer进行自动化操作,另一方面为了防止上班时间被打扰,是时候爬点歌单在上班的时候,用来抵抗外界的干扰了。 保证本地安装了 MongoDB 数据库,并能正常连接,具体请自行百度。 由于 Puppeteer 会下载一个 Chrome 浏览器到本地,所以可能较慢…
nginx 详解 - 详细配置说明
本文为看视频《Nginx入门到实践》总结的学习笔记。 Nginx 是一个开源且高性能、高可靠的 HTTP 中间件、代理服务。 Replace “OS” with “rhel” or “centos”, depending on the distribution used, an…
《Spring Boot Cookbook》阅读笔记
Spring Boot 阅读笔记