spring源码1--初探

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 beanDefinitionMap;
(点进AnnotationConfigApplicationContext类的父类GenericApplicationContext的构造的DefaultListableBeanFactory()方法–就可以找到了)

进入BeanDefinition查看接口结构(alt+7)和继承关系结构(ctrl+h):
spring源码1--初探_第1张图片

在这里插入图片描述
探索开始:debug走起:
spring源码1--初探_第2张图片
先进入这里面debug看看:
spring源码1--初探_第3张图片
先看结构:
spring源码1--初探_第4张图片
源码:我们先只看该类的属性和构造:

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 里面的值的变化:

spring源码1--初探_第5张图片
可以看到,干干净净,整整齐齐!!!!!
我们点击debug进入下一步:
走过
this.reader = new AnnotatedBeanDefinitionReader(this);方法时候,工厂里面的 beanDefinitionMap发生了变化,说明这个方法对工厂做了事了,那我们来研究研究
spring源码1--初探_第6张图片
spring源码1--初探_第7张图片
总结:这里我们知道了,spring的AnnotationConfigApplicationContext()构造一开始会去加载父类的构造,并继承父类中初始化的beanfactory

那我们下一步就是分析 该方法做了些啥了?
续spring源码2–AnnotationConfigApplicationContext()构造方法之reader

你可能感兴趣的:(spring分析,spring,java,mvc)