private static void annotationTest ( ) {
AnnotationConfigApplicationContext acc = new AnnotationConfigApplicationContext ( ) ;
acc. scan ( "com.lishu" ) ;
acc. addBeanFactoryPostProcessor ( new ServiceBeanFactory ( ) ) ;
acc. register ( ServiceFactoryBean . class ) ;
acc. refresh ( ) ;
CommonController controller = ( CommonController ) acc. getBean ( "commonController" ) ;
}
扫描-doScan
findCandidateComponents(basePackage):扫描basePackage下面的 java 文件,通过ASM框架 找到候选组件,并转为 BeanDefinition (ScannedGenericBeanDefinition ); 处理BeanDefinition:设置默认的Scope属性 (单例:singleton ,原型:prototype ); 生成beanName (内部类 :全类名 + $ + 内部类名 ); 设置默认属性(lazyInit :null;AutowireMode :0;); 检测注解,并设置相关属性:Lazy、Primary、DependsOn、Role、Description ; 构建对应的BeanDefinitionHolder ,原型会在生成一个ScopedProxyFactoryBean 的BD,里面保存了目标BD 的信息,且会提前在beanDefinitionMap 中注册一个key为scopedTarget.xxxx value为目标BD 的ScannedGenericBeanDefinition; 注册到 Map<String, BeanDefinition> beanDefinitionMap ;注册别名到 Map<String, String> aliasMap ,原型还会在此处放进 key为xxxx value为 ProxyBean的RootBeanDefinition ; 注册Spring自带的注解后置处理器:AnnotationAwareOrderComparator 准备工厂
prepareBeanFactory(beanFactory):注册一些必要的后置处理器; 调用 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 相关注解 :该注解参数类型 --> 普通类 、ImportSelect 、ImportBeanDefinitionRegistrar; 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() 这里为啥还会再找一遍? 实例化Bean后置处理器 --> registerBeanPostProcessors(beanFactory) 完成初始化-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 ) 第⑦ 次应用后置处理器:BeanPostProcessor 的postProcessBeforeInitialization 方法,初始化前的方法 第⑧次应用后置处理器:InitializingBean 接口的afterPropertiesSet 方法,BeanPostProcessor 的postProcessAfterInitialization 方法 第⑨次调用后置处理器:SmartInitializingSingleton 接口的afterSingletonsInstantiated 方法 最后设置下生命周期处理器,环境初始化完成!