Spring源码
2020-05-13 14:30:08 2 举报
Spring源码图
作者其他创作
大纲/内容
BeanDefinitionRegistry注册器
BeanPostProcessor
解释
ClassPathBeanDefinitionScanner扫描器
继承
AnnotatedBeanDefinitionReaderbeanDefinition读取器,解析加了注解的类,然后转换成beanDefinition
第三步:循环处理postProcessBeanDefinitionRegistry
后置处理器
加了@Configuration注解会生成cglib代理,会进入ConfigurationClassEnhancer中完成cglib代理,不加就不实现
第三种情况:实现ImportBeanDefinitionRegistrar接口
List集合中BeanPostProcessor后置处理器
下面有很多实现了该接口的后置处理器,所以要把需要的注册进去
invokeBeanFactoryPostProcessor方法
通过registerAnnotationConfigProcessors()注册6个对象
接口ImportSelector
String[] selectImports(AnnotationMetadata importingClassMetadata);
接口BeanDefinitionRegistryPostProcessor
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry);插手bean实例化过程,实例化前做一些事情
ImportBeanDefinitionRegistrar
读取器和扫描器完成后最后调用refresh()方法初始化Spring
BeanDefinition
BeanPostProcessor插手Bean实例化,通过invokeBeanFactoryPostProcessors执行
是一个内部类,在ConfigurationClassPostProcessor里
beanDefinitionMap
beanDefinitionHodler就是一个map方便传参
registerBeanDefinitions方法可以得到BeanDefinitionRegistry,所以可以动态的添加BeanDefinition,也可以改变BeanDefinition,我们自己添加
类ConfigurationClassPostProcessor
这个类就是用来在bean实例化之前处理一些事情
很多重要的方法
ClassPathBeanDefinitionScanner:扫描包或类,但是这里的并不做这些事,它只是扫描程序员自己手动调用scan()方法时才用到,正在的扫描包或类都是spring内部自己new的一个ClassPathBeanDefinitionScanner
子类
ConfigurationClassParser:解析各个配置类,会放到set集合中,防止多个配置类重复
通过registerPostProcessor方法把ConfigurationClassPostProcessor注册进
维护了很多重要的对象
SpringAOP
BeanPostProcessor后置处理器,插手bean实例化过程,实例化后,没有放到spring的bean容器之前
ImportSelector
那么返回的这个类是什么时候放入BeanDefinitionMap中的呢?
AnnotatedBeanDefinitionReader
ImportAwareBeanPostProcessor
扫描得到所有的@Component的BeanDefinition
AnnotatedBeanDefinition用来描述加了注解的类
通过BeanDefinitionRegistry的registerBeanDefinition方法 put进beanDefinitionMap
7个放入List中
invokeBeanDefinitionRegistryPostProcessor方法
它的方法
首先在父类中创建一个工厂DefaultListableBeanFactory
第一种情况:普通类,加了@Component注解的类
第一步:得到用户自定义的BeanDefinitionRegistryPostProcessor
接口ImportBeanDefinitionRegistrar
可以动态调用某个类,就是一个开关,就是有些你自己写的类,可能只用到过一次,做个判断开启调用,AOP就是这样实现的
BeanDefinitionRegistryPostProcessor后置处理器,在BeanFactoryPostProcessor之前执行,因为源码中先遍历的BeanDefinitionRegistryPostProcessor(有内部的和自定义的)自定义的先执行,自定义的就是自己手动调用addBeanFactoryPostProcessor方法添加的
BeanDefinitionRegistryPostProcessor
spring扩展之一,实现这个接口可以动态的往beanDefinitionMap中添加一个bean,可以干预实例化过程,@MapperScan:底层就是把接口变成对象,并且在Spring当中,底层就是实现了ImportBeanDefinitionRegistrar
ApplicationListenerDetector
应用场景
BeanFactoryPostProcessor后置处理器,在spring的bean容器中任意一个bean没有被new出来之前
BeanFactoryPostProcessor
生成的cglib代理对象会实现EnhancedConfiguration接口,这个接口又继承了BeanFactoryAware接口,这个接口中的 setBeanFactory()方法可以直接获得beanFactory,这样就可以放入BeanDefinition中了
如果b()方法调用了a();那是不是又new了一个A对象,显然不符合bean的单例形式,所以需要cglib代理,当执行到b()方法时,代理类会先判断这个A类是不是第一次new,如果是则代理对象通过proxy.invokeSuper()调用父类的当前方法new出对象,否则就通过$$BeanFacotory.getBean()方法得到该对象,这样就不会产生多例的情况了
第二种情况:@Import(xxx.class)直接把xxx.class拿出来进行解析,如果xxx.class中是实现了ImportSelector接口的类,就会调用其中的selectImports()方法,返回一个字符串(类名)
就是ConfigurationClassPostProcessor
为什么要生成cglib代理呢?
BeanPostProcessor后置处理器
AOP
会通过registerBeanPostProcessors方法把需要执行的注册进List中
beanDefinitionNames存放beanName
Mybatis中的@MapperScan注解
BeanPostProcessor后置处理器。spring提供的一个扩展点之一,通过实现这个接口可以插手bean实例化过程,减轻BeanFactory的负担,可以设置多个,然后依次执行,比如AOP就是在bean实例化期间把逻辑织入到bean实例中的,也正是实现了BeanPostProcessor与IOC建立了联系
@import注解三种情况:1.普通类 2.ImportSelector 3.ImportBeanDefinitionRegistrar
beanName
dependencyComparator,用来排序的
实现
ConfigurationClassPostProcessor中的postProcessBeanFactory方法,针对加了@Configuration的配置类生产cglib动态代理
Spring大环境
重要
RootBeanDefinition描述Spring内部提供的类
第二步:得到内置的BeanDefinitionRegistryPostProcessor
ConfigurationClassPostProcessor扫描三种@Import注解、@Bean注解、判断配置类是否完整的配置类
开始处理BeanDefinitionRegistryPostProcessor
通过beanDefinition的构造方法把一个类变成beanDefinition:类的描述
这个代理对象是如何交给spring管理的呢?
selectImports方法返回一个类名(全名),动态添加BeanDefinition,它帮你添加
ApplicationContextPostProcessor
处理所有的@Import
解析加了@Configuration的类
ConfigurationClassEnhancer类:完成cglib代理
ClassPathBeanDefinitionScanner
1.AnnotationAwareAspectJAutoProxyCreator处理AOP的后置处理器
作用
@Configuration注解加不加都会被解析,那么为什么还要加呢?
AnnotationConfigApplicationContext
执行所有的BeanDefinitionRegistryPostProcessor
接口BeanFactoryPostProcessor
开始处理BeanFactoryPostProcessor
在ConfigurationClassPostProcessor的processConfigBeanDefinitions方法中会通过ConfigurationClassUtils.checkConfigurationClassCandidate方法检查是否加了@Configuration注解,如果加了spring会认为它是一个全注解,则为BeanDefinition设置configurationClass属性为full,且下面的注解就不在判断了@Component、@ComponentScan、@Import、@ImportResource。如果没加,spring会认为它是一个部分注解,则为BeanDefinition设置configurationClass属性为lite
0 条评论
下一页