context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-provider.xml"});
// 删除了一些步骤
public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {
try {
// 1. 里面的核心代码就是初始化了 applicationEventMulticaster, 用户后面发布事件使用
// this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
initApplicationEventMulticaster();
// 2. 初始化非延迟加载的 bean, 这里就会初始化 dubbo 配置的一些 bean, 包括 ServiceBean, 用于服务导出
finishBeanFactoryInitialization(beanFactory);
// 3. 发布容器刷新事件, 这里面是服务导出的入口
finishRefresh();}
}
}
// 步骤 2 分析
// 这里 Spring 容器会初始化非延迟加载的 bean, 包括 <dubbo:service/> 表示的 bean
// <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService"/>
finishBeanFactoryInitialization(beanFactory);
// Spring 容器初始化 <dubbo:service/> 表示的 ServiceBean 时会创建 ServiceBean 对象, 由于 ServiceBean 实现了
// ApplicationContextAware 接口, 所以 Spring 容器会先调用 setApplicationContext 给其注入 Spring 容器
class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean,
ApplicationContextAware, ApplicationListener<ContextRefreshedEvent>, BeanNameAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
// 给 SpringExtensionFactory 注入 Spring 容器
SpringExtensionFactory.addApplicationContext(applicationContext);
if (applicationContext != null) {
SPRING_CONTEXT = applicationContext;
try {
// method 是 addListener 方法, 调用该方法用于给 applicationEventMulticaster
// 添加 listener
method.invoke(applicationContext, new Object[]{this});
supportedApplicationListener = true;
}
}
}
}