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<String, BeanDefinition> beanDefinitionMap;
(点进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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值