spring源码笔记(一)

1.AnnotationConfigApplicationContext对象使用AnnotationConfigApplicationContext#register(Class class)方法register注册一个不加任何注解的类是不需            要 AnnotationConfigApplicationContext#refresh方法来refresh的,只有在注册一个配置类时需要

 

 

2.AnnotationConfigApplicationContext在创建过程中进行了那些操作?

 

 首先会执行内部方法this()#register()#refresh(),this()方法的主要作用是初始化AnnotatedBeanDefinitionReader类读取器和ClassPathBeanDefinitionScanner扫描器,

 

并且会执行父类构造方法,父类构造方法的作用是初始化DefaultListableBeanFactory

 

 

 

 

接着这些register(Class annotatedClasses)方法-----》this.reader.register(annotatedClasses)------》registerBean(annotatedClass)-----》doRegisterBean(annotatedClass,null,null,null)------》

 

 对传入的Bean进行封装得到一个AnnotatedGenericBeanDefinition对象

 

 

 处理通用的注解,通过反射获取配置的所有注解,若存在,则作为abd的属性设置进去

 AnnotationConfigUtils.processCommonDefinitionAnnotations(abd)-------》processCommonDefinitionAnnotations(abd, abd.getMetadata())------》

 

 接着执行BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry)-------》registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());---

 

--------》this.beanFactory.registerBeanDefinition(beanName, beanDefinition);

 

 它的主要作用是将获取到的abd以map的形式存放到beanFactory中(DefaultListableBeanFactory)

 

 这个beanFactory是上面提到的AnnotationConfigApplicationContext初始化的时候调用父类构造方法时进行初始化的DefaultListableBeanFactory对象

 

 

--------------------------------------------------------------------------------

下面执行refrech()方法:

 

 

prepareRefresh();方法主要是做一些准备工作,主要是一些环境的配置,
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();主要是获取到刚刚存放bad的beanFactory工厂

最主要看的是ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();这个方法

 

 它的作用呢,主要是加载一些类加载器以及对一些postProcessors后置处理器的回调,包括比如ApplicationContextAwareProcessor,后置处理器PostProcessor的作用主要是便于我对bean的实例化过程进行一些扩展,比如,springAop中可以通过动态代理织入一些功能,并且返回一个代理对象到IOC容器当中。

 

 添加ApplicationContextAwareProcessor这个后置处理器,是为了我们在实例化bean之后,只要我们的bean实现了ApplicationContextAware这个接口能够通过实现后置处理器的方法获取到ApplicationContext对象。

 

 

我们可以自己实现一个后置处理器,只要实现了BeanPostProcessor的接口,Spring容器会以列表的方式依次执行所有的后置处理器,同时,我们也可以指定后置处理器的执行顺序,只要实现了
PriorityOrdered即可,数值越小越先执行。

 

posted @ 2021-01-14 00:59  shawdown  阅读(95)  评论(0)    收藏  举报