简述spring的工作原理

建议不要硬着头皮看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里面。仅此而已,没必要花更多精力。建议还是多看看底层的知识。

首先,你要知道一个javaweb项目,在没有spring或者其他框架的情况下,是如何运行的。如果没有框架,肯定是在web.xml文件里配置若干个servlet。如果使用了springmvc,会只配一个servlet(org.springframework.web.servlet.DispatcherServlet),然后所有的请求都会首先进入这个servlet,从这里开始看,先看spring的配置如何加载,bean的创建也在这里(Spring IOC);然后看一个请求是怎样从DispatcherServlet到你自己的Controller的;然后看你的方法的返回,是怎样渲染到页面的,如果视图文件是模板文件,那么最后肯定有一个out.println( 渲染后的字符串) ;如果视图文件是jsp文件,那么最后肯定有一个request.forward(jsp文件),这是Spring MVC。数据持久化层有人用mybatis,有人用hibernate,也有人用spring jdbc template,想看spring jdbc template就从dao层看起,看到sql怎样执行,最后怎样返回为止尝试着,自己写一个最简的版本。

上一篇:HDU-1166敌兵布阵(线段树)


下一篇:LINUX中,find结合grep正则表达式,快速查找代码文件。