以下分析基于spring-framework-5.0.x,关于源码可以自行去github上下载
java中描述对象的我们称为类class,spring 中描述对象的信息的包括元数据信息,注解信息的我们称为bean.
我们通过分析spring源码一步一步解析:
先发一个整体模型图
首先我们编写一个启动类:AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Appconfig.class);
二、我们可以看到上面已经完成了beanFactory的创建、beanDefinitionReader的创建、ClassPathBeanDefinitionScanner的创建、register也即AnnotationConfigApplicationContext。接着我们进去register(annotatedClasses);这个方法看:
//注册单个bean给容器 比如有新加的类可以用这个方法 但是注册注册之后需要手动调用refresh方法去触发容器解析注解有两个意思 他可以注册一个配置类 他还可以单独注册一个bean
this.reader.register(annotatedClasses)->registerBean(annotatedClass)->doRegisterBean(annotatedClass, null, null, null);
三、我们可以看到上面完成了对单个或多个普通类或者配置类的解析并注册到了beanDefinition的map中,这个map很重要后续工厂实例化bean的信息都来自这里。接着我们看refresh()这个方法
这个方法做的功能会比较多。比较简单的就直接看代码和注释理解 和上面一样我们重点分析关键方法
首先我们看下prepareBeanFactory这个方法:
beanFactory:bean工厂,可以产生bean
factoryBean:一个特殊的bean,当我们需要把一个bean手动加入spring管理时,然而加入的bean内部存在许多其他的依赖,我们一般不能直接改引入bean的代码给他加上@Compenent(因为有可能是jar),也不方便使用@config或者xml去手动配置所有的bean信息即他们之间的相互依赖关系。这时候我们可以通过实现这个factoryBean完成对三方插件的引入spring管理(三方插件内部的其他依赖由三方自己维护)。如sqlsessionFactoryBean。
doScan:通过解析注解中的路径,找到路径下的.class文件,然后根据Class.forName生成class分析class中是否有依赖注入的注解如(@Component)等,有的话就通过字节码文件newInstance生成一个实例。
link:https://blog.csdn.net/nuomizhende45/article/details/81158383