@Component
public class MyLifeCycle implements SmartLifecycle {
private boolean isRunning = false;
@Override
public void start() {
System.out.println("MyLifeCycle:start");
isRunning = true;
}
@Override
public void stop() {
System.out.println("MyLifeCycle:stop");
isRunning = false;
}
//返回true,stop(Runnable callback)或stop()方法才会被执行,返回false,start方法才会被执行
@Override
public boolean isRunning() {
return isRunning;
}
//返回true时start()方法会被自动执行,返回false则不会
@Override
public boolean isAutoStartup() {
return true;
}
//SmartLifecycle子类的才有的方法,当方法isRunning()返回true才执行
@Override
public void stop(Runnable callback) {
callback.run();
isRunning = false;
}
//执行顺序,数值越小越先执行
@Override
public int getPhase() {
return 0;
}
}
源码跟踪
1.AbstractApplicationContext
protected void finishRefresh() {
// Clear context-level resource caches (such as ASM metadata from scanning).
clearResourceCaches();
// Initialize lifecycle processor for this context.
// 创建默认的DefaultLifecycleProcessor
initLifecycleProcessor();
// Propagate refresh to lifecycle processor first.
// DefaultLifecycleProcessor#onRefresh()
getLifecycleProcessor().onRefresh();
// Publish the final event.
publishEvent(new ContextRefreshedEvent(this));
// Participate in LiveBeansView MBean, if active.
LiveBeansView.registerApplicationContext(this);
}
2.DefaultLifecycleProcessor
1.执行onRefresh方法
2.执行startBeans方法
private void startBeans(boolean autoStartupOnly) {
// 在容器中获取所有的Lifecycle实现类
Map<String, Lifecycle> lifecycleBeans = getLifecycleBeans();
Map<Integer, LifecycleGroup> phases = new HashMap<>();
lifecycleBeans.forEach((beanName, bean) -> {
// 遍历所有的Lifecycle实现类,如果是实现SmartLifecycle的并且isAutoStartup()方法返回true
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);
//以getPhase()方法返回的值为key存储
phases.put(phase, group);
}
//如果getPhase()相同会被放到一个LifecycleGroup里面最后执行初始化
group.add(beanName, bean);
}
});
if (!phases.isEmpty()) {
List<Integer> keys = new ArrayList<>(phases.keySet());
Collections.sort(keys);
for (Integer key : keys) {
//从小到大获取值并执行start()方法
phases.get(key).start();
}
}
}
DefaultLifecycleProcessor#LifecycleGroup
public void start() {
if (this.members.isEmpty()) {
return;
}
if (logger.isDebugEnabled()) {
logger.debug("Starting beans in phase " + this.phase);
}
Collections.sort(this.members);
//this.members维护着getPhase()相同的对象,然后遍历执行start()方法
for (LifecycleGroupMember member : this.members) {
doStart(this.lifecycleBeans, member.name, this.autoStartupOnly);
}
}
private void doStart(Map<String, ? extends Lifecycle> lifecycleBeans, String beanName, boolean autoStartupOnly) {
//每个LifecycleGroup对象里面都有个lifecycleBeans集合的引用
Lifecycle bean = lifecycleBeans.remove(beanName);
if (bean != null && bean != this) {
String[] dependenciesForBean = getBeanFactory().getDependenciesForBean(beanName);
for (String dependency : dependenciesForBean) {
doStart(lifecycleBeans, dependency, autoStartupOnly);
}
//SmartLifecycle中isRunning()方法和isAutoStartup()方法的判断
if (!bean.isRunning() &&
(!autoStartupOnly || !(bean instanceof SmartLifecycle) || ((SmartLifecycle) bean).isAutoStartup())) {
if (logger.isTraceEnabled()) {
logger.trace("Starting bean '" + beanName + "' of type [" + bean.getClass().getName() + "]");
}
try {
bean.start();
}
catch (Throwable ex) {
throw new ApplicationContextException("Failed to start bean '" + beanName + "'", ex);
}
if (logger.isDebugEnabled()) {
logger.debug("Successfully started bean '" + beanName + "'");
}
}
}
}