从零开始分析spring源码
注:先把spring源码从git上当选来,spring5的源码(百度都是教程)
AnnotationConfigApplicationContext a = new AnnotationConfigApplicationContext();
这是基于注解方式的加载spring应用
另外还有:ClassPathXmlApplicationContext的方式
对于AnnotationConfigApplicationContext来说,实现了BeanDefinitionRegistry接口(BeanDefinitionRegistry继承了AliasRegistry接口)
AliasRegistry:别名注册(方法有增删改查别名)
BeanDefinitionRegistry:作用是注册beanDefinition(方法有增删改查是否包含beanDefinition)
- beanDefinition:引用网上的说法:类名、scope、属性、构造函数参数列表、依赖的bean、是否是单例类、是否是懒加载等,其实就是将Bean的定义信息存储到这个BeanDefinition相应的属性中,后面对Bean的操作就直接对BeanDefinition进行,例如拿到这个BeanDefinition后,可以根据里面的类名、构造函数、构造函数参数,使用反射进行对象创建。
bean定义实际上就是一个bean的模板,之后会用这个bean定义模板去创建对象放到spring容器中。
beanDefinition的继承关系:
AttributeAccessor:属性访问器(增删改查属性)
BeanMetadataElement:没明白啥意思以后再说
beanDefinition中有一个ResolvableType getResolvableType()方法:借鉴
beanDefinition有以下的实现类:
对于AnnotationConfigApplicationContext来说,有参的构造方法:
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
//调用构造方法
this();
//对将要管理的bean进行注册
register(componentClasses);
//ioc的主要进行方法
refresh();
}
this方法调用了无参的构造方法
public AnnotationConfigApplicationContext() {
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}