docs/Spring全家桶/Spring源码分析/Spring启动流程/Spring启动流程(十):启动完成的处理.md
ģ spring ̡
AbstractApplicationContext#finishRefresh £
protected void finishRefresh() {
// ־֪ˣʼһϵвʹõԴ
clearResourceCaches();
// ʼLifecycleProcessor
initLifecycleProcessor();
// ڲʵʵLifecycleӿڵbean
getLifecycleProcessor().onRefresh();
// ContextRefreshedEvent¼
publishEvent(new ContextRefreshedEvent(this));
// spring.liveBeansView.mbeanDomainǷڣоͻᴴһMBeanServer
LiveBeansView.registerApplicationContext(this);
}
벻࣬ͼǷֱ
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 ġ
ʲô 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;
}
ӱֻǸһ״̬
publishEvent(new ContextRefreshedEvent(this)) ContextRefreshedEventԼҲ¼¼IJ룬 spring ¼ϸԲο spring ֮̽ spring ¼ơ
÷£
protected void resetCommonCaches() {
ReflectionUtils.clearCache();
AnnotationUtils.clearCache();
ResolvableType.clearCache();
CachedIntrospectionResults.clearClassLoader(getClassLoader());
}
ӷִиֻ棬ִбȽϼͲˡ
ԭӣhttps://my.oschina.net/funcy/blog/4892555 ߸ˮƽд֮ӭָԭףҵתϵȨҵתע