blog 解析包 而已 post 反射 wire 常见 异常 创建
作者:王奕然
链接:https://www.zhihu.com/question/21346206/answer/101789659
基本原理其实就是通过反射解析类及其类的各种信息,包括构造器,方法及其参数,属性.然后将其封装成 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 里面.仅此而已,
spring 基本原理
来源: http://www.bubuko.com/infodetail-2458230.html