demo
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application.xml");
System.out.println("context 启动成功");
MessageService messageService = context.getBean(MessageService.class);
System.out.println(messageService.getMessage());
}
ioc启动核心代码
public ClassPathXmlApplicationContext(
String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
throws BeansException {
super(parent);
setConfigLocations(configLocations);
if (refresh) {
refresh();
}
}
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
prepareRefresh();
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
prepareBeanFactory(beanFactory);
try {
postProcessBeanFactory(beanFactory);
StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
invokeBeanFactoryPostProcessors(beanFactory);
registerBeanPostProcessors(beanFactory);
beanPostProcess.end();
initMessageSource();
initApplicationEventMulticaster();
onRefresh();
registerListeners();
finishBeanFactoryInitialization(beanFactory);
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
destroyBeans();
cancelRefresh(ex);
throw ex;
}
finally {
resetCommonCaches();
contextRefresh.end();
}
}
}
ioc启动流程
启动代码框架

- 启动前准备工作
- 初始化BeanFactory
- 2.1、解析xml,抽象BeanDefinition
- 2.2、初始化 Map<String, BeanDefinition> beanDefinitionMap
- 2.3、初始化 List beanDefinitionNames
- 2.4、初始化Map<Class<?>, Object> resolvableDependencies
- 初始化容器组件
- 3.1 、类加载器
- 3.2 、spel Resolver
- 3.3 、设置aware
- 3.4 、注册可装配的依赖,而不是bean:BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
- 3.5 、注册early post-processor检测bean是否为applicationlistener
- 3.6 、注册默认的环境beans:environment
- 3.7 、注册BeanFactoryPostProcessor
- 3.8 、执行BeanFactoryPostProcessor
- 3.9 、注册BeanPostProcessor
- 3.10 、国际化
- 3.11、执行onRefresh()钩子函数
- 3.12、注册监听
- 创建实例(单实例,lazy-init 的除外)
- 容器启动收尾工作,广播事件,ApplicationContext 初始化完成
容器启动流程图

ClassPathXmlApplicationContext类图

bean生命周期,源码请阅读finishBeanFactoryInitialization 方法
- 创建BeanFactory
- 执行BeanDefinitionRegistryPostProcessor接口方法
- 执行BeanFactoryPostProcessor接口方法
- 调用Bean的构造方法
- 设置属性(set,自动注入)
- 执行各种xxxAware方法
- 调用BeanPostProcessor接口的postProcessBeforeInitialization方法
- 执行初始化方法,分三种
- bean中指定init-method
- bean中实现@postConsruct
- bean中实现了InitializingBean 接口中afterPropertiesSet方法
- 调用BeanPostProcessor接口的postProcessAfterInitialization方法
- 容器关闭时,调用DisposableBean接口的销毁方法
- 执行destroy-method方法


循环依赖问题
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
synchronized (this.singletonObjects) {
singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null) {
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null) {
ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
if (singletonFactory != null) {
singletonObject = singletonFactory.getObject();
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
}
}
return singletonObject;
}
ApplicationContext注入问题
spring发布订阅模式
- org.springframework.context.event.SimpleApplicationEventMulticaster#multicastEvent(org.springframework.context.ApplicationEvent, org.springframework.core.ResolvableType)
public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {
ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
Executor executor = getTaskExecutor();
for (ApplicationListener<?> listener : getApplicationListeners(event, type)) {
if (executor != null) {
executor.execute(() -> invokeListener(listener, event));
}
else {
invokeListener(listener, event);
}
}
}
## LifecycleProcessor接口
- 在Spring中提供了Lifecle接口,Lifecycle 中包含start/stop方法,实现此接口后Spring会保证在启动的时候调用其start方法开始生命周期,并在Spring关闭的时候调用 stop方法来结束生命周期
public interface Lifecycle {
void start();
void stop();
boolean isRunning();
}
- 当ApplicationContext自身启动和停止时,它将自动调用上下文内所有生命周期的实现。通过委托给LifecycleProcessor来做这个工作。注LifecycleProcessor继承了Lifecycle接口。它也增加了两个其他的方法来与上下文交互,使得可以刷新和关闭。
public interface LifecycleProcessor extends Lifecycle {
void onRefresh();
void onClose();
}
- 那为什么要用LifecycleProcessor 把Lifecycle包装一遍呢?
- 因为Lifecycle的start(), stop()方法都要手动调用,而LifecycleProcessor提供了回调方法供开关ApplicationContext时自动调用。
- 多个Lifecycle的调用是有一定的顺序要求的,比如一个类依赖于另一个类,那么另一个类就要先执行。而LifecycleProcessor恰好提供了getPhase()来控制开关的顺序。
spring 设计模式