spring启动过程详解

1、启动spring容器的方法:
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAOP.class);
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
        this();            //以无参构造器生成上下文对象
        register(annotatedClasses);    //将配置类注册到容器中
        refresh();    //启动容器具体过程
}        

Refresh:

//为执行refresh做准备,比如:设置容器状态,将配置文件和环境变量加载到spring容器中,并且验证是否设置了必须的属性
prepareRefresh();

//更新BeanFactory状态,获得spring容器的beanFactory
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

//为BeanFactory做准备工作,比如设置类加载器、spel表达式解析器、部分Aware接口的后置处理器、注册依赖和环境变量
prepareBeanFactory(beanFactory);

//允许在子上下文中使用BeanFactoryPostProcessor处理BeanFactory,此处是个空实现
postProcessBeanFactory(beanFactory);

//在AbstractApplicationContext中的invokeBeanFactoryPostProcessors方法中调用PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors())来进行BeanFactory的后置处理。
进行BeanFactory的后置处理主要通过BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor
先执行的BeanDefinitionRegistryPostProcessor:首先调用实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor,其次调用实现Ordered接口的BeanDefinitionRegistryPostProcessor,最后是一般的BeanDefinitionRegistryPostProcessor(invokeBeanDefinitionRegistryPostProcessors方法是实现ImportBeanDefinitionRegistrar重要步骤,比如启用AOP的AspectJAutoProxyRegistrar)。
其后执行的BeanFactoryPostProcessor:首先调用实现PriorityOrdered接口的BeanFactoryPostProcessor,其次调用实现Ordered接口的BeanFactoryPostProcessor,最后是一般的BeanFactoryPostProcessor
invokeBeanFactoryPostProcessors(beanFactory);


//获取Bean的后置处理器定义,然后首先将实现PriorityOrdered接口的BeanPostProcessor排序后注册到容器,其次将实现Ordered接口的BeanPostProcessor排序后注册到容器,然后将一般的BeanPostProcessor注册到容器,最后将spring内部的BeanPostProcessor注册到容器。
registerBeanPostProcessors(beanFactory);

// 初始化国际化资源,首先判断容器中是否有id为messageSource的,有的话则使用容器中的MessageSource来做国际化,否则使用DelegatingMessageSource作为初始化MessageSource的类。所以如果要自定义国际化资源,注入的实例id必须为messageSource,否则不生效。
initMessageSource();

// 初始化应用事件广播器,如果用户没有注入,默认使用SimpleApplicationEventMulticaster的multicastEvent方法进行事件广播(使用多线程的方法向所有监听器发送通知),
initApplicationEventMulticaster();

// 在特殊的上下文子类中初始化其他特殊的bean,默认为空实现
onRefresh();

// 注册监听器,默认只有ScheduledAnnotationBeanPostProcessor(@Schedule注解的实现),用户可以通过注入ApplicationListener的子类来注册监听器。
registerListeners();

// 初始化还未初始化的实例并且注入(必须是非懒加载模式的)。
finishBeanFactoryInitialization(beanFactory);

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
    // 如果容器中注入了ConversionService的实现类,则将该实例作为应用的类型转化方案
    if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
            beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
        beanFactory.setConversionService(
                beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
    }
    // 如果没有Bean的后置处理器(例如PropertyPlaceholderConfigurer)注册,则注入一个StringValueResolver的实例来解析配置文件。PropertyPlaceholderConfigurer中会生成一个StringValueResolver实例用于解析。
    if (!beanFactory.hasEmbeddedValueResolver()) {
        beanFactory.addEmbeddedValueResolver(new StringValueResolver() {
            @Override
            public String resolveStringValue(String strVal) {
                return getEnvironment().resolvePlaceholders(strVal);
            }
        });
    }
    //LoadTimeWeaver用于当类被载入jvm时,动态转化类。实现了LoadTimeWeaverAware接口的bean可以接收一个指向载入时织入实例的引用。在Spring的JPA支持中,载入时织入对于JPA类转化是必要的。
    String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
    for (String weaverAwareName : weaverAwareNames) {
        getBean(weaverAwareName);
    }
    // 不在使用临时类加载器进行类型匹配
    beanFactory.setTempClassLoader(null);
    // 冻结配置信息,不在允许改变所有的bean定义
    beanFactory.freezeConfiguration();
    // 初始化剩下非懒加载的单实例。首先判断判断bean定义是否是懒加载、单实例和抽象的,是的话对于实现SmartInitializingSingleton接口的调用afterSingletonsInstantiated方法;否则判断是不是工厂bean,不是的话则创建调用getBean方法,在doGetBean方法中,对于满足sharedInstance != null && args == null条件的通过getObjectForBeanInstance创建实例,否则对于单实例bean,调用AbstractBeanFactory.this.createBean方法生成实例。
AbstractAutowireCapableBeanFactory:
protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
    if (this.logger.isDebugEnabled()) {
        this.logger.debug("Creating instance of bean '" + beanName + "'");
    }
    RootBeanDefinition mbdToUse = mbd;
    Class<?> resolvedClass = this.resolveBeanClass(mbd, beanName, new Class[0]);
    if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
        mbdToUse = new RootBeanDefinition(mbd);
        mbdToUse.setBeanClass(resolvedClass);
    }

    try {
        mbdToUse.prepareMethodOverrides();
    } catch (BeanDefinitionValidationException var7) {
        throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(), beanName, "Validation of method overrides failed", var7);
    }

    Object beanInstance;
    try {
//对于实现InstantiationAwareBeanPostProcessor接口的类进行如下操作,调用相应的postProcessBeforeInstantiation
        beanInstance = this.resolveBeforeInstantiation(beanName, mbdToUse);
        if (beanInstance != null) {
            return beanInstance;
        }
    } catch (Throwable var8) {
        throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "BeanPostProcessor before instantiation of bean failed", var8);
    }
    beanInstance = this.doCreateBean(beanName, mbdToUse, args);

doCreateBean的部分实现
                            try {
对实例进行属性赋值
                                this.populateBean(beanName, mbd, instanceWrapper);
                                if (exposedObject != null) {
//初始化bean
                                    exposedObject = this.initializeBean(beanName, exposedObject, mbd);
                                }

initializeBean的方法:
protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
    if (System.getSecurityManager() != null) {
        AccessController.doPrivileged(new PrivilegedAction<Object>() {
            public Object run() {
                AbstractAutowireCapableBeanFactory.this.invokeAwareMethods(beanName, bean);
                return null;
            }
        }, this.getAccessControlContext());
    } else {
        this.invokeAwareMethods(beanName, bean);
    }

    Object wrappedBean = bean;
    if (mbd == null || !mbd.isSynthetic()) {
//对实例调用postProcessorsBeforeInitialization方法
        wrappedBean = this.applyBeanPostProcessorsBeforeInitialization(bean, beanName);
    }

    try {
 //调用类的初始化方法
        this.invokeInitMethods(beanName, wrappedBean, mbd);

  invokeInitMethods代码:
protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd) throws Throwable {
    boolean isInitializingBean = bean instanceof InitializingBean;
//对实现InitializingBean的子类调用afterPropertiesSet方法
    if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
        if (this.logger.isDebugEnabled()) {
            this.logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
        }

        if (System.getSecurityManager() != null) {
            try {
                AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
                    public Object run() throws Exception {
                        ((InitializingBean)bean).afterPropertiesSet();
                        return null;
                    }
                }, this.getAccessControlContext());
            } catch (PrivilegedActionException var6) {
                throw var6.getException();
            }
        } else {
            ((InitializingBean)bean).afterPropertiesSet();
        }
    }

//对采用了@Bean中initMethod调用对应的初始化方法
    if (mbd != null) {
        String initMethodName = mbd.getInitMethodName();
        if (initMethodName != null && (!isInitializingBean || !"afterPropertiesSet".equals(initMethodName)) && !mbd.isExternallyManagedInitMethod(initMethodName)) {
            this.invokeCustomInitMethod(beanName, bean, mbd);
        }
    }

}

    } catch (Throwable var6) {
        throw new BeanCreationException(mbd != null ? mbd.getResourceDescription() : null, beanName, "Invocation of init method failed", var6);
    }

    if (mbd == null || !mbd.isSynthetic()) {
//对实例调用postProcessorsAfterInitialization方法
        wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    }

    return wrappedBean;
}


} catch (Throwable var18) {
                            if (var18 instanceof BeanCreationException && beanName.equals(((BeanCreationException)var18).getBeanName())) {
                        throw (BeanCreationException)var18;
                        }

                    throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", var18);
}
    if (this.logger.isDebugEnabled()) {
        this.logger.debug("Finished creating instance of bean '" + beanName + "'");
    }
    return beanInstance;
}

    beanFactory.preInstantiateSingletons();
}

// Last step: publish corresponding event.
finishRefresh();

 

更多问题可以加公众号:代码小栈,期待为您解决更多问题

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值