Spring源码概览(注解版)

// 注解版
private static void annotationTest(){
		AnnotationConfigApplicationContext acc = new AnnotationConfigApplicationContext();
		acc.scan("com.lishu");
//		acc.scan("com.lishu.circular");
		acc.addBeanFactoryPostProcessor(new ServiceBeanFactory());
		acc.register(ServiceFactoryBean.class);
		acc.refresh();
		CommonController controller = (CommonController)acc.getBean("commonController");
	}
  1. 扫描-doScan
    • findCandidateComponents(basePackage):扫描basePackage下面的 java 文件,通过ASM框架找到候选组件,并转为 BeanDefinitionScannedGenericBeanDefinition);
    • 处理BeanDefinition:设置默认的Scope属性(单例:singleton,原型:prototype
    • 生成beanName内部类全类名 + $ + 内部类名
    • 设置默认属性(lazyInit:null;AutowireMode:0;)
    • 检测注解,并设置相关属性:Lazy、Primary、DependsOn、Role、Description
    • 构建对应的BeanDefinitionHolder,原型会在生成一个ScopedProxyFactoryBean的BD,里面保存了目标BD的信息,且会提前在beanDefinitionMap中注册一个key为scopedTarget.xxxx value为目标BDScannedGenericBeanDefinition;
    • 注册到 Map<String, BeanDefinition> beanDefinitionMap;注册别名到 Map<String, String> aliasMap,原型还会在此处放进 key为xxxx value为 ProxyBean的RootBeanDefinition
    • 注册Spring自带的注解后置处理器:AnnotationAwareOrderComparator
  2. 准备工厂
    • prepareBeanFactory(beanFactory):注册一些必要的后置处理器;
  3. 调用 BeanFactory 后置处理器
    • getBeanFactoryPostProcessors() --> 获取通过 AnnotationConfigApplicationContext.addBeanFactoryPostProcessor() 注册的 BeanFactoryPostProcessor后置处理器及其子类
    • 执行 BeanDefinitionRegistryPostProcessor . postProcessBeanDefinitionRegistry;缓存BeanFactoryPostProcessor后置处理器(两者是继承关系哦)
    • 拿到Spring内部实现 BeanDefinitionRegistryPostProcessor 的处理器,此处会调用 getBean() 获取bean实例;
    • 执行 Spring 提供BeanDefinitionRegistryPostProcessor . postProcessBeanDefinitionRegistry
      • 检查BDMap中加了注解的类,在attributes中增加标识 Full lite 属性;full: 该类存在 @Configuration 注解时;lite:当该类存在 @Component@ComponentScan@Import@ImportResource@Bean 等注解时;
      • 通过 ConfigurationClassParser 去解析选中的 注解类,此处会构建该类对应的 ConfigurationClass 对象;
      • 1- 处理 Imported 的情况:通俗的讲就是判断下当前对象是否被解析过了,合并或者擦除当前对象、(2-8)递归处理配置类及其超类层次结构
      • 2- 处理内部类;
      • 3- 处理任何@PropertySource注解:解析 properties、yml等的配置文件
      • 4- 处理 @ComponentScan 注解:处理该注解时,spring 会创建一个新的扫描器(ClassPathBeanDefinitionScanner),并设置内部 BeanName Generator 进行 doscsn 扫描, 之后进行 “执行” 流程 ;
      • 5- 处理 @Import 相关注解:该注解参数类型 --> 普通类ImportSelectImportBeanDefinitionRegistrar;
      • 6- 处理 @ImportResource 注解
      • 7- 处理加了 @Bean 的方法
      • 8- 处理接口上的默认方法
      • 9- 处理超类
      • 通过 ConfigurationClassBeanDefinitionReader 解析1-9后生成的 ConfigurationClass 对象:
      • 1:通过 @Import 注解得到的 ConfigClass ,name属性是null,此时生成新的名称(全类名)会构建 AnnotatedGenericBeanDefinition 并注册到 BDMap;(被Import的类在这里完成注册
      • 2:处理 ConfigClass 中 @Bean 标记的方法,构建ConfigurationClassBeanDefinition并注册到BDMap(加@Bean注解的方法在这里完成注册
      • 3:处理 ConfigClass 中 @ImportResource 注解添加的配置文件
      • 4:处理 ConfigClass 中的 ImportBeanDefinitionRegistrar 创建
    • 执行 实现了Ordered接口 及其他的BeanDefinitionRegistryPostProcessor . postProcessBeanDefinitionRegistry()
    • 执行所有BeanFactoryPostProcessors 的回调 --> postProcessBeanFactory()
    • 执行实现了PriorityOrdered接口的BeanFactoryPostProcessors . postProcessBeanFactory()
    • 这里为啥还会再找一遍?
  4. 实例化Bean后置处理器 --> registerBeanPostProcessors(beanFactory)
  5. 完成初始化-finishBeanFactoryInitialization
    • 允许缓存所有 Bean 定义元数据,而不期望进一步更改;其实到这里可以认为,我们不能再对BD进行修改了,getBean()
    • 非(抽象、单例、延迟) && 非 FactoryBean子类;
    • 从三级缓存中获取、一级->二级->三级,拿到直接返回;普通类一定会返回null,调用 getBean()
    • 标记 beanName 正在创建,从 mergedBeanDefinitions 中拿到BD
    • 处理 @DependsOn:检查 deepOn 依赖,检验是否形成循环依赖,会在两个map中记录两者的相互关系;完成依赖 bean 的实例化–>getBean()
    • 次应用后置处理器:InstantiationAwareBeanPostProcessor接口的 postProcessBeforeInstantiation
    • 次应用后置处理器:SmartInstantiationAwareBeanPostProcessor接口的determineCandidateConstructors方法,doCreateBean() . createBeanInstance();–>通过3种方式创建bean实例:1、通过工厂方法创建;2、通过构造方法自动注入(autowire by constructor)创建;3、通过无参构造方法;(要注意:此处如果存在@Lookup、@Replace注解时,会产生CGLIB代理的实例)
    • 次应用后置处理器:MergedBeanDefinitionPostProcessor接口的postProcessMergedBeanDefinition,这里推断出属性注入点:1、CommonAnnotationBeanPostProcesso -->@Resource;2、AutowiredAnnotationBeanPostProcessor -->@Autowired、** @Value**
    • 次应用后置处理器:SmartInstantiationAwareBeanPostProcessor接口的getEarlyBeanReference方法,提前在singletonFactories中暴露一个工厂, BeanDefinition默认支持循环依赖;
    • 次应用后置处理器:InstantiationAwareBeanPostProcessor接口的postProcessAfterInstantiation方法,目前看,这里可以阻断属性注入流程;
    • 次应用后置处理器:InstantiationAwareBeanPostProcessor接口的postProcessProperties方法,完成属性填充(注意这里默认注入方式是 0,实现BeanFactoryPostProcess接口,获取到对应的bean,进行设置装配模型 AUTOWIRE_BY_NAME AUTOWIRE_BY_TYPE
    • 次应用后置处理器:BeanPostProcessorpostProcessBeforeInitialization方法,初始化前的方法
    • 第⑧次应用后置处理器:InitializingBean接口的afterPropertiesSet方法,BeanPostProcessorpostProcessAfterInitialization方法
    • 第⑨次调用后置处理器:SmartInitializingSingleton接口的afterSingletonsInstantiated方法
    • 最后设置下生命周期处理器,环境初始化完成!
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值