稍微总结一下。怎样读源码
spring源码学习从最基础的HelloWorld开始。spring的HelloWorld就三行代码:public void test() {ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");SomeBea
spring 源码学习
从最基础的Hello World开始。
spring的Hello World就三行代码:
public void test() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
SomeBean someBean= (SomeBean) context.getBean("someBean");
someBean.doSomething();
}这个hello world非常简单,通过xml文件,创建一个容器context,然后从容器中获取一个bean。
运行完这段代码后,问自己两个问题:
容器创建时做了什么?
getBean()时又做了什么?
虽然这个例子是用的xml配置,但是搞懂这两个问题,对于另外两种配置方式,注解配置和Java Config,也就顺理成章了,原理都一样的。
如何才能知道?调试。
好,开始回答第一个问题,容器创建时做了什么?
不管是xml,还是注解、Java Config,这些都是为了方便使用者而设计的,JVM可不知道说<bean>这个标签是啥意思,所以自然的,Spring需要对这些配置进行解析。
比如对于xml,就用XmlBeanDefinitionReader,把你写的beans.xml解析出来,你要创建什么对象,这些对象依赖哪些对象,是不是要懒加载(lazy-init),是不是单例...... 通通解析出来,放到一个叫BeanDefinition的对象里头,有多少种对象,就有多少个BeanDefinition,然后把这些BeanDefinition放到一个Map里头。
BeanDefinition有什么用?当然是为了后面实例化Bean用的,为什么要把配置信息放到BeanDefinition里?自然是不想每次需要实例对象时都去解析配置信息。
创建完所有BeanDefinition之后,会马上实例化对象吗?
如果用的是BeanFactory作为容器,则不会,对象默认都
原创不易,完成人机校验,阅读全文