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

java 加载spring_spring的加载机制?相关推荐

  1. java虚拟机及加载class文件的原理机制

    2019独角兽企业重金招聘Python工程师标准>>> (点击获取更多资料的下载) java 虚拟机 ‎2007‎年‎4‎月‎23‎日,‏‎14:18:00 | chenweicai ...

  2. 深入java虚拟机学习 -- 类的加载机制(续)

    昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...

  3. 常见Java面试题之JVM加载class文件的原理机制

    JVM加载class文件的原理机制 JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的 ...

  4. java文件读入原理_描述一下JVM加载class文件的原理机制

    1.JVM 简介 JVM 是我们Javaer 的最基本功底了,刚开始学Java 的时候,一般都是从"Hello World "开始的,然后会写个复杂点class ,然后再找一些开源 ...

  5. Java提高篇——JVM加载class文件的原理机制

    阅读目录 1.JVM 简介 2.JVM 的组成部分 3.JVM加载class文件的原理机制 在面试java工程师的时候,这道题经常被问到,故需特别注意. 回到顶部 1.JVM 简介 JVM 是我们Ja ...

  6. 类加载器 java委托机制_解析Java虚拟机中类的初始化及加载器的父委托机制

    类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始化: 2.在静态代码块中进行初始化. 没有 ...

  7. J2EE JVM加载class文件的原理机制

    JVM加载class文件的原理机制 1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中 2.java中的 ...

  8. JVM加载class文件的原理机制

    阅读目录 1.JVM 简介 2.JVM 的组成部分 3.JVM加载class文件的原理机制 在面试java工程师的时候,这道题经常被问到,故需特别注意. 回到顶部 1.JVM 简介 JVM 是我们Ja ...

  9. 分析BootstrapClassLoader/ExtClassLoader/AppClassLoader的加载路径 及父委托机制

    http://blog.csdn.net/irelandken/article/details/7048817 分析BootstrapClassLoader/ExtClassLoader/AppCla ...

最新文章

  1. Java:new一个对象的过程中发生了什么?
  2. linux docker搭建 minecraft 我的世界游戏服务器
  3. ABAP 向上取整和向下取整 CEIL FLOOR
  4. POJ 1655 Balancing Act[树的重心/树形dp]
  5. php 字符串进行计算_怎么在php中利用eval对字符串格式进行计算
  6. java 马踏棋盘优化_我所知道的十大常用算法之马踏棋盘算法(深度搜索、贪心思想优化 )...
  7. 解读阿里巴巴集团的“大中台、小前台”组织战略
  8. linux使用root操作文件,以root用户登录Linux系统,当前目录是/root,要求完成如下操作和功...
  9. Python精简入门级学习(二)
  10. 【转】如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误...
  11. PACPerformance
  12. python中string.digits_Python3基础:String模块ascii_letters和digits
  13. robot---百度百科
  14. 【转】英语词汇学习渐进
  15. UID_PR_01_基础操作
  16. SqlServer2005 provider: TCP 提供程序, error: 0 - 由于目标计算机积极拒绝,无法连接。) (Microsoft SQL Server,错误: 10061)问题解决
  17. 如何使用Hyper-V Manager和Powershell合并Hyper-V检查点
  18. java泛型的上界下界
  19. bmi计算器HTML,BMI计算器(示例代码)
  20. 民谣歌手花粥被曝侵权新闻事件数据分析

热门文章

  1. zk 加载 html 标签,HTML字符实体——ZK支持字符
  2. 【编译原理笔记12】中间代码生成:简单赋值语句的翻译,数组引用的翻译
  3. php 脚本会超时吗,PHP脚本执行超时的解决办法
  4. log4j:WARN Please initialize the log4j system properly.解决方案
  5. EDA实验课课程笔记(六)——NC-verilog的介绍与使用(二)
  6. java编写计算器实现cancel_用Java编写的简易计算器
  7. mysql重复添加计数_从MySQL中的单个列获取重复值的计数?
  8. Mac 上制作 SSL 证书
  9. dojo + jersey 上传图片到数据库
  10. 关闭流时,抛出异常:java.io.IOException: Stream Closed