建议不要硬着头皮看spring代码,自己的代码800多m,就是不上班开始看也不知道何时看完。若是想学学ioc,控制反转这些建议看看jodd项目,比较简练,可是我仍然不建议过多的看这些框架的代码,由于这些代码要完成任务须要不少琐碎的类实现,好比读取某个包下面的全部类,解析class的头文件,反射各类信息,再加上封装,颇有可能在读源码的过程当中掉到各类细节里出不来,因此读这种源码要事无巨细,理解原理便可。 基本原理其实就是经过反射解析类及其类的各类信息,包括构造器、方法及其参数,属性。而后将其封装成bean定义信息类、constructor信息类、method信息类、property信息类,最终放在一个map里,也就是所谓的container,池等等,其实就是个map。。汗。。。。当你写好配置文件,启动项目后,框架会先按照你的配置文件找到那个要scan的包,而后解析包里面的全部类,找到全部含有@bean,@service等注解的类,利用反射解析它们,包括解析构造器,方法,属性等等,而后封装成各类信息类放到一个map里。每当你须要一个bean的时候,框架就会从container找是否是有这个类的定义啊?若是找到则经过构造器new出来(这就是控制反转,不用你new,框架帮你new),再在这个类找是否是有要注入的属性或者方法,好比标有@autowired的属性,若是有则仍是到container找对应的解析类,new出对象,并经过以前解析出来的信息类找到setter方法,而后用该方法注入对象(这就是依赖注入)。若是其中有一个类container里没找到,则抛出异常,好比常见的spring没法找到该类定义,没法wire的异常。还有就是嵌套bean则用了一下递归,container会放到servletcontext里面,每次reQuest从servletcontext找这个container便可,不用屡次解析类定义。若是bean的scope是singleton,则会重用这个bean再也不从新建立,将这个bean放到一个map里,每次用都先从这个map里面找。若是scope是session,则该bean会放到session里面。仅此而已,不必花更多精力。建议仍是多看看底层的知识。