Spring启动过程分析6(finishRefresh)

finishRefresh方法调用LifecycleProcessor的onRefresh()方法,发送ContextRefreshedEvent

AbstractApplicationContext.finishRefresh:

1
2
3
4
5
6
7
8
9
protected void finishRefresh() {
// 实例化lifecycle processor
initLifecycleProcessor();
// 调用lifecycle
getLifecycleProcessor().onRefresh()

publishEvent(new ContextRefreshedEvent(this));
LiveBeansView.registerApplicationContext(this);
}

onRefresh

onRefresh调用的是DefaultLifecycleProcessor.onRefresh:

1
2
3
4
public void onRefresh() {
startBeans(true);
this.running = true;
}
  • DefaultLifecycle.startBeans(boolean autoStartupOnly)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    private void startBeans(boolean autoStartupOnly) {
    Map<String, Lifecycle> lifecycleBeans = getLifecycleBeans();
    Map<Integer, LifecycleGroup> phases = new HashMap<Integer, LifecycleGroup>();
    for (Map.Entry<String, ? extends Lifecycle> entry : lifecycleBeans.entrySet()) {
    Lifecycle bean = entry.getValue();
    if (!autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) {
    int phase = getPhase(bean);
    LifecycleGroup group = phases.get(phase);
    if (group == null) {
    group = new LifecycleGroup(phase, this.timeoutPerShutdownPhase, lifecycleBeans, autoStartupOnly);
    phases.put(phase, group);
    }
    group.add(entry.getKey(), bean);
    }
    }
    if (!phases.isEmpty()) {
    List<Integer> keys = new ArrayList<Integer>(phases.keySet());
    Collections.sort(keys);
    for (Integer key : keys) {
    phases.get(key).start();
    }
    }
    }
  • DefaultLifecycleProcessor.start()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void start() {
    if (this.members.isEmpty()) {
    return;
    }
    if (logger.isInfoEnabled()) {
    logger.info("Starting beans in phase " + this.phase);
    }
    Collections.sort(this.member);
    for (LifecycleGroupMember member : this.members) {
    if (this.lifecycleBeans.containsKey(member.name)) {
    doStart(this.lifecycleBeans, member.name, this.autoStartupOnly);
    }
    }
    }
  • DefaultLifecycleProcessor.doStart

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    private void doStart(Map<String, ? extends Lifecycle> lifecycleBeans, String beanName, boolean autoStartupOnly) {
    Lifecycle bean = lifecycleBeans.remove(beanName);
    if (bean != null && !this.equals(bean)) {
    String[] dependenciesForBean = this.beanFactory.getDependenciesForBean(beanName);
    for (String dependency : dependenciesForBean) {
    doStart(lifecycleBeans, dependency, autoStartupOnly);
    }
    if (!bean.isRunning() && (!autoStartupOnly || !(bean instanceof SmartLifecycle) || ((SmartLifecycle) bean).isAutoStartup())) {
    if (logger.isDebugEnabled()) {
    logger.debug("Starting bean '" + beanName + "' of type [" + bean.getClass() + "]");
    }
    try {
    bean.start();
    }
    catch (Throwable ex) {
    throw new ApplicationContextException("Failed to start bean '" + beanName + "'", ex);
    }
    if (logger.isDebugEnabled()) {
    logger.debug("Successfully started bean '" + beanName + "'");
    }
    }
    }
    }
可以看到最终调用的Lifecycle接口的start方法