先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
-
Servlet WebApplicationContext:这是对J2EE三层架构中的
web
层进行配置,如控制器(controller
)、视图解析器(view resolvers
)等相关的bean。通过spring mvc
中提供的DispatchServlet来加载配置,通常情况下,配置文件的名称为spring-servlet.xml。 -
Root WebApplicationContext:这是对J2EE三层架构中的
service
层、dao
层进行配置,如业务bean
,数据源(DataSource
)等。通常情况下,配置文件的名称为applicationContext.xml
。在web
应用中,其一般通过ContextLoaderListener
来加载。
如果你想要学习Java的话,我给你分享一些Java的学习资料,你不用浪费时间到处搜了,从Java入门到精通的资料我都给你整理好了,这些资料都是我做Java这几年整理的Java最新学习路线,Java笔试题,Java面试题,Java零基础到精通视频课程,Java开发工具,Java练手项目,Java电子书,Java学习笔记,PDF文档教程,Java程序员面经,Java求职简历模板等,这些资料对你接下来学习Java一定会带来非常大的帮助,每个Java初学者都必备,请你进我的**Java技术qq交流群127522921**自行下载,所有资料都在群文件里,进去要跟大家多交流学习哦。
Spring的启动
=========
要想很好的理解它们之间的关系,我们就有必要先弄清楚Spring的启动流程。要弄清楚这个启动流程我们就需要搭建一个SpringMvc
项目,说句实话,用惯了SpringBooot
开箱即用,突然在回过头来搭建一个SpringMvc
项目还真有点不习惯,一大堆的配置文件。(虽然也可以用注解来实现)具体怎么搭建SpringMvc
项目这个就不介绍了,搭建好项目我们运行起来可以看到控制台会输出如下日志:日志里面分别打印出了父容器和子容器分别的一个耗时。
如何验证是有两个容器?
===========
我们只需要Controller
与我们的Service
中实现ApplicationContextAware
接口,就可以得知对应的管理容器:在Service
所属的父容器里面我们可以看到父容器对应的对象是XmlWebApplicationContext@3972
在
Controller
中对应的容器对象是XmlWebApplicationContext@4114
由此可见它们是两个不同的容器。
源码分析
====
我们知道SpringServletContainerInitializer
从 servlet 3.0
开始,Tomcat
启动时会自动加载实现了 ServletContainerInitializer
接口的类(需要在 META-INF/services
目录下新建配置文件)也称为 SPI(Service Provider Interface)
机制,SPI
的应用还是挺广的比如我们的JDBC
、还有Dubbo
框架里面都有用到,如果还有不是很了解SPI
机制的 可以去学习下。所以我们的入口就是SpringServletContainerInitializer
的onStartup
方法,这也应该是web容器启动调用Spring
相关的第一个方法。
初始化SpringIoc
如果实在找不到入口的话,我们可以 根据控制台打印的日志,然后拿着日志进行反向查找这应该总能找到开始加载父容器的地方。启动的时候控制台应该会打印出“Root WebApplicationContext: initialization started
” 我们拿着这个日志就能定位到代码了
public WebApplicationContext initWebApplicationContext(ServletContext servletContext) {
if (servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null) {
throw new IllegalStateException(
"Cannot initialize context because there is already a root application context present - " +
“check whether you have multiple ContextLoader* definitions in your web.xml!”);
}
servletContext.log(“Initializing Spring root WebApplicationContext”);
Log logger = LogFactory.getLog(ContextLoader.class);
if (logger.isInfoEnabled()) {
logger.info(“Root WebApplicationContext: initialization started”);
}
long startTime = System.currentTimeMillis();
try {
// Store context in local instance variable, to guarantee that
// it is available on ServletContext shutdown.
if (this.context == null) {
// 通过反射去创建context
this.context = createWebApplicationContext(servletContext);
}
if (this.context instanceof ConfigurableWebApplicationContext) {
ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) this.context;
if (!cwac.isActive()) {
// The context has not yet been refreshed -> provide services such as
// setting the parent context, setting the application context id, etc
if (cwac.getParent() == null) {
// The context instance was injected without an explicit parent ->
// determine parent for root web application context, if any.
ApplicationContext parent = loadParentContext(servletContext);
cwac.setParent(parent);
}
// IOC容器初始化
configureAndRefreshWebApplicationContext(cwac, servletContext);
}
}
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
ClassLoader ccl = Thread.currentThread().getContextClassLoader();
if (ccl == ContextLoader.class.getClassLoader()) {
currentContext = this.context;
}
else if (ccl != null) {
currentContextPerThread.put(ccl, this.context);
}
if (logger.isInfoEnabled()) {
long elapsedTime = System.currentTimeMillis() - startTime;
logger.info(“Root WebApplicationContext initialized in " + elapsedTime + " ms”);
}
return this.context;
}
catch (RuntimeException | Error ex) {
logger.error(“Context initialization failed”, ex);
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ex);
throw ex;
}
}
这段代码就是创建父容器的地方。
初始化 Spring MVC
最后
金三银四马上就到了,希望大家能好好学习一下这些技术点
学习视频:
大厂面试真题:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-EGnvXpnq-1713393231267)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!