# 关于dubbo xml中占位符无法解析问题
如果你看到你这篇文章,说明正在为这个麻烦而查找相关的资料。这个问题实际上在社区中存在了很久。
本文使用一个独特的角度,用于分析原因。
## dubbo的配置bean
dubbo的配置的bean,从整体(抛开dubbo)来说,都是普通的bean。本质上和你定义bean没有任何区别。
唯一值得你留意是ReferenceBean,他的确是一个普通bean,唯一不同的是他是一个FactoryBean。
## FactoryBean的问题
在spring的环境中FactoryBean存在一种提前暴露的可能性。考虑一下FactoryBean提前爆料可能性,让我们观察一下这个接口
public interface FactoryBean<T> {
Class<?> getObjectType();
}
其中这个方法是极其重要的方法。他反映了FactoryBean内部的类型。 我们再来看Dubbo中的配置
public class ReferenceBean<T> extends ReferenceConfig<T> implements FactoryBean,
ApplicationContextAware, InitializingBean, DisposableBean {
@Override
public Class<?> getObjectType() {
return getInterfaceClass();
}
}
这里存在一个问题,如果在提前初始化流程,读者认为getObjectType是什么? 结果是NULL!
这导致容器不知这个实际的类型是什么,他需要是FactoryBean的getObject进行bean的暴露
## 怎么办
BeanDefinition是bean的中间状态,我们只要在FactoryBean的beanDefinition中暴露出这个类型即可,就不会造成dubbo的提前初始化。
1 if (ReferenceBean.class.equals(beanClass)) {
if (beanDefinition.getPropertyValues().get("interface") != null) {
RootBeanDefinition copy = beanDefinition.cloneBeanDefinition();
MutablePropertyValues mutablePropertyValues = copy.getPropertyValues();
copy.setBeanClassName(String.valueOf(mutablePropertyValues.get("interface")));
BeanDefinitionHolder holder = new BeanDefinitionHolder(copy, id);
beanDefinition.setDecoratedDefinition(holder);
}
}