spring给我们最大的好处和优点:
1、控制反转
2、依赖注入
3、切面编程(AOP)
下面我们开始spring源码初探:
首先我们想要问spring要什么:类呗!!!
那我们就从熟悉的AnnotationConfigApplicationContext下手:
public class Dtest2Application {
public static void main(String[] args) {
// SpringApplication.run(Dtest2Application.class, args);
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(Appconfig.class);
context.refresh();
}
}
先来说一说我们看源码的思路:debug+自己的思路;
1、我们首先最先想到的是spring的类从哪里来,当然是工厂。
2、我们要知道spring的工厂存的是:
private final Map
(点进AnnotationConfigApplicationContext类的父类GenericApplicationContext的构造的DefaultListableBeanFactory()方法–就可以找到了)
进入BeanDefinition查看接口结构(alt+7)和继承关系结构(ctrl+h):
探索开始:debug走起:
先进入这里面debug看看:
先看结构:
源码:我们先只看该类的属性和构造:
private final AnnotatedBeanDefinitionReader reader;
private final ClassPathBeanDefinitionScanner scanner;
public AnnotationConfigApplicationContext() {
StartupStep createAnnotatedBeanDefReader = this.getApplicationStartup().start("spring.context.annotated-bean-reader.create");
this.reader = new AnnotatedBeanDefinitionReader(this);
createAnnotatedBeanDefReader.end();
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
public AnnotationConfigApplicationContext(DefaultListableBeanFactory beanFactory) {
super(beanFactory);
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
this();
this.register(componentClasses);
this.refresh();
}
public AnnotationConfigApplicationContext(String... basePackages) {
this();
this.scan(basePackages);
this.refresh();
}
对比,并没有this里面的所有东西,那就是继承的了:
进入父类构造中:
public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry {
private final DefaultListableBeanFactory beanFactory;
@Nullable
private ResourceLoader resourceLoader;
private boolean customClassLoader;
private final AtomicBoolean refreshed;
public GenericApplicationContext() {
this.customClassLoader = false;
this.refreshed = new AtomicBoolean();
this.beanFactory = new DefaultListableBeanFactory();
}
这里可以看到,beanFactory 初始化了!!!!
我们现在就关注beanFactory 里面的值的变化:
可以看到,干干净净,整整齐齐!!!!!
我们点击debug进入下一步:
走过
this.reader = new AnnotatedBeanDefinitionReader(this);方法时候,工厂里面的 beanDefinitionMap发生了变化,说明这个方法对工厂做了事了,那我们来研究研究
总结:这里我们知道了,spring的AnnotationConfigApplicationContext()构造一开始会去加载父类的构造,并继承父类中初始化的beanfactory
那我们下一步就是分析 该方法做了些啥了?
续spring源码2–AnnotationConfigApplicationContext()构造方法之reader