对外暴露的Api是AbstractApplicationContex的方法。用AbstractApplicationContext的getBean方法得到一个Bean实例。
主要的类是DefaultBeanFactory,通过他来连接各个功能类。
XmlBeanDefinitionReader是解析Xml文件的类,也是一个很重要的类,他把Xml文件解析,得到BeanDefinition。
在BeanDefinitionRegistry接口中抽象了两个方法,用来将解析Xml得到的BeanDefinition注册到BeanDefiniton中的map中(id,BeanDefinition)
-
BeanFactory是获取Bean实例的接口,具体方法实现也是在DefaultBeanFactory类中,判断是否是单例,如果是单例,调用DefaultSingletonBeanFactory的getBean方法,此时还没有创建实例,所以去创建实例,通过反射创建实例
ClassLoader beanClassLoader = this.getBeanClassLoader(); String beanClassName = bd.getBeanClassName(); try { // return Class.forName(bd.getBeanClassName()).newInstance(); Class<?> clz = beanClassLoader.loadClass(beanClassName); return clz.newInstance();
将返回的实例放到单例类的map中,下次再调用getBean方法的时候,就直接取出来了。
如果不是单例,每次都直接创建bean就好了。
6.ClassPathXmlApplicationContext FileSystemXmlApplicationContext是用来获取Resoutce资源类的,ClassPathResource和他的兄弟类,是将路径下的Xml文件转化为Resource资源类。
总结:
感觉功能理解比较容易:每个类的功能都很单一,遵循单一职责原则,每个类都有自己的接口,体现了扩展性,但是自己很菜,看完还是很模糊。