SpringBoot实战分析(六)创建应用程序上下文

程序入口

context = createApplicationContext();

断点跟踪

1.判断环境类型和初始化

当前方法默认加载的是

org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext这个类。

protected ConfigurableApplicationContext createApplicationContext() {
    Class<?> contextClass = this.applicationContextClass;
    if (contextClass == null) {
        try {
            switch (this.webApplicationType) {
            case SERVLET:
                contextClass = Class.forName(DEFAULT_WEB_CONTEXT_CLASS);
                break;
            case REACTIVE:
                contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS);
                break;
            default:
                contextClass = Class.forName(DEFAULT_CONTEXT_CLASS);
            }
        }
  省略。。。。。。
    }
    return (ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass);
}

contextClass的值域:


2.实例化类

获取AnnotationConfigServletWebServerApplicationContext声明的构造器,然后去按照构造器实例化。

public static <T> T instantiateClass(Class<T> clazz) throws BeanInstantiationException {
    Assert.notNull(clazz, "Class must not be null");
    if (clazz.isInterface()) {
        throw new BeanInstantiationException(clazz, "Specified class is an interface");
    }
    try {
        // 走clazz.getDeclaredConstructor()方法
        Constructor<T> ctor = (KotlinDetector.isKotlinType(clazz) ?
                KotlinDelegate.getPrimaryConstructor(clazz) : clazz.getDeclaredConstructor());
        return instantiateClass(ctor);
    }
    省略。。。。。。
}

public static <T> T instantiateClass(Constructor<T> ctor, Object... args) throws BeanInstantiationException {
    Assert.notNull(ctor, "Constructor must not be null");
    try {
        ReflectionUtils.makeAccessible(ctor);
        //走ctor.newInstance(args))方法
        return (KotlinDetector.isKotlinType(ctor.getDeclaringClass()) ?
                KotlinDelegate.instantiateClass(ctor, args) : ctor.newInstance(args));
    }
省略。。。。。。
}

3.返回context






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值