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容器也比较简单~"