1、寻找Dubbo服务导出的入口方法
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;
}
}
}
}
发表回复