1.模拟Spring实现过程:
① 根据传入的配置类,扫描配置类是否有@ComponentScan注解,有就扫描该注解下的包路径
ZhouyuApplicationContext applicationContext = new ZhouyuApplicationContext(AppConfig.class);
② 包路径下的类上标识@Component注解,才会创建bean定义,最终缓存到bean定义Map
③ 如果实现 BeanPostProcessor,利用反射创建该类的实例缓存到集合List
④ 遍历bean定义Map,创建bean,在创建bean的过程中:
判断bean的字段是否标注@Autowired注解,需要属性赋值
判断bean如果是BeanPostProcessor的子类,执行初始化前回调方法:postProcessBeforeInitialization
判断bean如果InitializingBean的子类,执行初始化回调方法:afterPropertiesSet
如果是beanPostProcessor子类,执行初始化后回调方法:postProcessAfterInitialization。同时也是AOP实现的入口
2.底层核心组件:
① bean定义:包括bean类型、作用域(单例或多例)、是否懒加载
编程式生成bean定义: BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition()
注册到容器:context.registerBeanDefinition(“name”, beanDefinition)
② 基础组件:
AnnotatedBeanDefinitionReader //基于注解的读取器,指定某个类解析成bean定义
XmlBeanDefinitionReader //基于xml的读取器,解析bean标签
ClassPathBeanDefinitionScanner //扫描器,指定路径下,扫描解析成bean定义
③ ApplicationContext:实现了很多父类,比BeanFactory功能更多
④ 类型转化器:
PropertyEditor,JDK提供的
ConversionService,Spring提供的,比JDK提供的功能更强大
TypeConverter,Spring内部使用的,整合了PropertyEditor和ConversionService的功能
⑤ 比较器:
OrderComparator,Spring 提供的比较器,实现PriorityOrdered的优先,如果都实现或者都没有实现,再比较Order值
AnnotationAwareOrderComparator,继承OrderComparator,支持@Order注解指定Order值
⑥ 获取元数据:MetadataReader metadataReader,根据扫描到的类文件获取元数据,底层使用的ASM字节码技术
metadataReader.getClassMetadata() 类的所有信息
metadataReader.getAnnotationMetadata() 类上的注解信息
⑦ ExcludeFilter && IncludeFilter:Spring扫描用来过滤的,ExcludeFilter表示排除过滤器,IncludeFilter表示包含过滤器
Spring为什么会扫描@Component的bean?因为在启动过程中,构造扫描器的时候,往IncludeFilter添加了new AnnotationTypeFilter(Component.class)
⑧ FactoryBean:在创建bean时,判断如果是FactoryBean的子类,就会调用getObject()方法创建bean,缓存到factoryBeanMap
@Bean:作用在方法上,告诉Spring容器通过该方法创建一个bean,和FactoryBean的本质比较类似
与FactoryBean的区别:
① FactoryBean需要创建2个bean,原始实现FactoryBean的bean是经过完整生命周期的,通过getObject()方法创建的bean没有经过完整的生命周期,但是会执行初始化后,为了兼容AOP
② @Bean 创建的bean会经过完整的生命周期