spring探索第一节
spring启动流程
spring用了很多年了,也会偶尔去看下,或者说去研究下spring源码,看spring源码确实让我在工作开发中有了很大的便易。但是从来没系统的去探究spring完整的一个启动流程,从这几天开始我就开始一步一步的去整理下spring的启动流程。
开始
要探究spring,实现得显式的去启动他了。我这里就只做了一个简单的测试:
// 实例化bean 过程
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(ConfigUtils.class);
Object b = annotationConfigApplicationContext.getBean("b");
然后大家启动debug就可以开始我们的spring探索之路了。
AnnotationConfigApplicationContext(Class<?>… componentClasses)
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
//1.实例化AnnotationConfigApplicationContext 并初始化reader(
// AnnotatedBeanDefinitionReader)和scanner(ClassPathBeanDefinitionScanner)
// 实例化GenericApplicationContext->extends->AbstractApplicationContext->DefaultResourceLoader
// ->调用DefaultListableBeanFactory->extends->AbstractAutowireCapableBeanFactory->
// extends->AbstractBeanFactory->extends
this();
register(componentClasses);
refresh();
}
大家可以看到第一个进来的就是AnnotationConfigApplicationContext(我是通过注解的方式加载spring的 )
里面主要有个三个方法第一个this(); 这个方法我们在这里不去细细研究他,只把他一笔带过,大家只需要知道,this()的时候他主要做了两个个工作。
1.初始化了reader和scanner
2.初始化了DefaultListableBeanFactory(这个就是我们所称的bean工厂了)
接下来需要研究的就是register(componentClasses); 这个方法了
register(componentClasses);
@Override
public void register(Class<?>... componentClasses) {
Assert.notEmpty(componentClasses, "At least one component class must be specified");
this.reader.register(componentClasses);
}
首先我们要看注释 Register one or more component classes to be processed.(注册一个或者多个要处理的组件),已经大概上说明了这个方法的作用。然后我们接着他的调用链往下。
public void register(Class<?>... componentClasses) {
for (Class<?> componentClass : componentClasses) {
registerBean(componentClass);
}
}
public void registerBean(Class<?> beanClass) {
doRegisterBean(beanClass, null, null, null, null);
}
private <T> void doRegisterBean(Class<T> beanClass,