博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java类spring加载_spring的加载机制?
阅读量:1540 次
发布时间:2019-04-21

本文共 2181 字,大约阅读时间需要 7 分钟。

1,今天面试官问我spring的加载机制有哪些---这么"抽象"的问题作为一个十多年经验的自己写过MVC,IOC,ORM, 等各种中间件小框架的开发人员也回答不出来~

确切的说是无从谈起,不知道从哪个角度说这个事情,在我的观点里这个问题本身的问法就有问题,什么叫"加载机制",spring加载的是什么????

我很好奇在问别人"spring的加载机制有哪些"的时候意图想知道spring是如何被启动的,还是spring是如何"加载"他管理的组件的;这个问题本身就有很大的歧义~

(我第一反应是后者,如果你是问前者,然后告诉我通过什么new XmlApplicationContext("app.xml")或者WebApplicationContext...这种是你的正确答案,我就会觉得你很LOW~

哈哈,当然后者其实也是一个很LOW的面试问题~).

WEB容器"加载"Spring这种说法其实是不合适的~Spring本身并没有纳入web容器的管理~

用"加载"这个词来描述Spring"启动"之后对"被管理组件"的初始化和管理也是非常可笑的说法~

所以其实你可以忽略这个面试官给你的影响的,很多面试官本身自个儿水平就不咋样,网上找一些有所谓正确答案的题目...很多时候他们其实自己都不知道自己在干什么问什么~

2,Spring最核心的东西是什么?尽管现在的spring看起来那么庞杂似乎保罗万象,但他最核心的东西是容器~

什么是容器?上面有人说容器就是个Map,这句话对也不对,

因为容器不仅仅是存放组件,它最主要的功能是"管理组件的生命周期和依赖".

对象的创建(包括初始化),销毁....当你从容器中get一个组件的时候,该组件所依赖的组件也必须相应的被初始化(当然也有可能是lazy的,只在真正用到的时候);

组件A依赖B和C,C依赖D,D依赖B.....我要得到组件A就需要相应的一层层的初始化其他组件,其他组件之间可能存在相互依赖这种情况,这种层层依赖的管理如果人工管理就会非常麻烦~容器能帮助你管理组件,让这种依赖看起来"扁平"一些~

这是容器核心要解决的问题~

至于其他IOC外围的功能比如MVC,AOP,集成其他第三方组件,都是次要的~从这一层面而言,Spring容器更像一个粘合剂~各个组件之间的连接和集成的桥梁~

3,有人提到了WEB容器(Tomcat),那就说说WEB容器;

如果你看过tomcat的代码你就发现,Tomcat本身就是一个容器~他管理着他自身组件的生命周期,你可以看一下tomcat conf目录下的 "server.xml",他是一个层次结构的包括Server,Connector,Engine,Context Listener 和我们直接关系的Servlet....

他的作用和spring的applicationContext.xml本质上是一样的~

Tomcat读取这个XML然后初始化这些组件,跟Spring读取XML初始化管理自己组件的本质其实是一样的;

这其实存在一个问题:他们是两个容器,对彼此容器内的东西没有控制权,这两个容器是不兼容的~ @廖雪峰 已经说了Tomcat根本不知道你是否使用了Spring,

Tomcat根据自己的XMLs(包括web.xml)管理自己的组件比如Servlet;Spring根据自己的applicationContext.xml(s)管理自己的组件~

好些年前我遇到过一个问题:

public class LoginServlet extends HttpServlet

{

private static final long serialVersionUID = 1L;

//这里有没有办法直接从Spring容器中获得UserService的实现呢? @Autowired

UserService userService;

有没有办法对Servlet的属性直接做依赖注入呢?大家思考一下?~

另外一个问题:

有没有办法让Spring来管理我们的Servlet,使得上面的UserService可以注入呢?

注意:我这里说的是容器定义的Servlet~不是什么你自己定义的Action或者Controller;

4,另外我觉得其实没有必要"非得"研究JVM或者GC,我是说没有必要为了面试去研究他们,如果你感兴趣,时间允许,没有任何问题~

否则就会像你说的:看了->用不到->忘了~

至于非得学什么新的框架~我觉得也没必要吧;

在我看来学会"使用"一个框架是很简单的事情,但学精任何框架都是很困难的事情~

多看看你现在会的框架,看看他们的代码知道为什么要那么干,知道他们功能的边界,什么事情不能干的,有没有更好的实现办法~多知道一些本质性的东西,我觉得可能会更好一些~

另外有时间关注一下新的技术,知道他们是什么能干吗就没问题了;

我觉得自己是一个需求驱动型的~遇到问题有思路就行了~

5,还有,有人说自己实现一个Spring也是非常简单的事儿~

按照这个逻辑我是不是也可以说造个核反应堆也是一个很简单事儿?

我只能说你考虑的太少了,很多事情原理很简单,但实际上你要遇到的问题远比你想象的多~

稍微严谨一点的表述是"自己写一个类似Spring的玩具IOC容器也比较简单~"

转载地址:http://wlrdy.baihongyu.com/

你可能感兴趣的文章
数据分析入门(二)
查看>>
从建表到SQL优化
查看>>
FindInSet性能优化
查看>>
MAC电脑:安装mysql报ERROR 1045 (28000)Access denied
查看>>
Linux Swap空间利用率过高
查看>>
网关、负载均衡、服务注册发现什么关系?
查看>>
桥接模式
查看>>
Servlet的生命周期02
查看>>
EL表达式的基本用法
查看>>
jstl标签库常见用法
查看>>
国际化输出笔记
查看>>
自定义jstl标签用法案例
查看>>
数据库笔记群集
查看>>
在div下动态拼接一个文本框
查看>>
数据连接池(数据源)的配置方法
查看>>
ajax用法笔记
查看>>
JavaScript实现的打字机效果
查看>>
Mac出现启动问题怎么办
查看>>
mac电脑变成访客模式,快速恢复管理员方法分享~
查看>>
mac电脑运行速度变慢的十种解决方法
查看>>