Back to Javatutorial

Spring启动流程(十):启动完成的处理

docs/Spring全家桶/Spring源码分析/Spring启动流程/Spring启动流程(十):启动完成的处理.md

1.0.03.9 KB
Original Source

ģ spring ̡

  1. : finishRefresh()

AbstractApplicationContext#finishRefresh £

protected void finishRefresh() {
    // ־֪ˣʼһϵвʹõԴ
    clearResourceCaches();
    // ʼLifecycleProcessor
    initLifecycleProcessor();
    // ڲʵʵLifecycleӿڵbean
    getLifecycleProcessor().onRefresh();
    // ContextRefreshedEvent¼
    publishEvent(new ContextRefreshedEvent(this));
    // spring.liveBeansView.mbeanDomainǷڣоͻᴴһMBeanServer
    LiveBeansView.registerApplicationContext(this);
}

벻࣬ͼǷֱ

  1. Դ棺clearResourceCaches()

clearResourceCaches() £

public class DefaultResourceLoader implements ResourceLoader {

    private final Map<Class<?>, Map<Resource, ?>> resourceCaches
        = new ConcurrentHashMap<>(4);

    public void clearResourceCaches() {
        this.resourceCaches.clear();
    }

    // ʡĺö
    ...

}

resourceCaches ģǸ Map Resource

ʲô Resource أǰɨĹУǻȰ class ļȡת Resource ٽһ Resource FileSystemResourceUrlResource ȣresourceCaches ǴЩ Resource ġ

  1. LifecycleProcessor

ʲô LifecycleProcessor

/**
 * رղ
 */
public interface LifecycleProcessor extends Lifecycle {

    /**
     * ʱ
     */
    void onRefresh();

    /**
     * رʱ
     */
    void onClose();

}

ӿرղԼʵָýӿڣȻд onRefresh() onClose()ԱرʱһЩ

@Component
public class MyLifecycleProcessor implements LifecycleProcessor {

    @Override
    public void onRefresh() {
        System.out.println("");
    }

    @Override
    public void onClose() {
        System.out.println("ر");
    }
}

LifecycleProcessor صķinitLifecycleProcessor()getLifecycleProcessor()һһΪ

AbstractApplicationContext

private LifecycleProcessor lifecycleProcessor;

/**
 * ʼ LifecycleProcessor
 */
protected void initLifecycleProcessor() {
    ConfigurableListableBeanFactory beanFactory = getBeanFactory();
    // ڣֱʹ
    if (beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)) {
        this.lifecycleProcessor =
                beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class);
    }
    // 򴴽ĬʹDefaultLifecycleProcessor
    else {
        DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor();
        defaultProcessor.setBeanFactory(beanFactory);
        this.lifecycleProcessor = defaultProcessor;
        beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor);
    }
}

/**
 *  lifecycleProcessor
 */
LifecycleProcessor getLifecycleProcessor() throws IllegalStateException {
    if (this.lifecycleProcessor == null) {
        throw new IllegalStateException(...);
    }
    return this.lifecycleProcessor;
}

initLifecycleProcessor ľ AbstractApplicationContext#lifecycleProcessor ԣ beanFactory д initLifecycleProcessor ֱʹãʹһ

getLifecycleProcessor() ֻǷ AbstractApplicationContext#lifecycleProcessor ԡ

getLifecycleProcessor().onRefresh() У onRefresh() һ DefaultLifecycleProcessor#onRefresh ʲô

@Override
public void onRefresh() {
    startBeans(true);
    this.running = true;
}

ӱֻǸһ״̬

  1. ContextRefreshedEvent ¼

publishEvent(new ContextRefreshedEvent(this)) ContextRefreshedEventԼҲ¼¼IJ룬 spring ¼ϸԲο spring ֮̽ spring ¼ơ

  1. : resetCommonCaches()

÷£

protected void resetCommonCaches() {
    ReflectionUtils.clearCache();
    AnnotationUtils.clearCache();
    ResolvableType.clearCache();
    CachedIntrospectionResults.clearClassLoader(getClassLoader());
}

ӷִиֻ棬ִбȽϼ򵥣Ͳˡ


ԭӣhttps://my.oschina.net/funcy/blog/4892555 ߸ˮƽд֮ӭָԭףҵתϵ߻Ȩҵתע