1 自定义标签
遗留问题:
- 在AbstractApplicationContext 中的prepareBeanFactory方法设置了addBeanPostProcessor ,是否和Bean 中的生命周期有关。在ClassPathXmlApplicationContext中调用了AsbstractApplicationContext的refresh方法。
- 依据RootBeanDefinition 实例化Bean
代码总结:
- 缓存数据模式 读缓存(未命中) - 加锁 - 读缓存 (未命中)- 缓存数据
- SPI实现依据参数读取不同的实现类。
dubbo-demo-consumer.xml 中使用了Dubbo自定义标签,例如:dubbo:application;dubbo:reference;在spring中使用自定义标签,有如下几步:
- 设置配置属性和JavaBean
设置一个与标签对应的JavaBean,用于存放标签中的属性值, 例如Dubbo中的ApplicationConfig、ReferenceConfig - 设置XSD文件
文件内容如 xsd链接 所示 - 编写BeanDefinitionParser
实现对配置文件中的标签解析。如 DubboBeanDefinitionParser - 编写NamespaceHandler
实现标签和解析类BeanDefinitionParser链接,如DubboNamespaceHandler,其中的init()代码如下:
// DubboNamespaceHandler.init()
@Override
public void init() {
registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
registerBeanDefinitionParser("config-center", new DubboBeanDefinitionParser(ConfigCenterBean.class, true));
registerBeanDefinitionParser("metadata-report", new DubboBeanDefinitionParser(MetadataReportConfig.class, true));
registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
registerBeanDefinitionParser("metrics", new DubboBeanDefinitionParser(MetricsConfig.class, true));
registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
registerBeanDefinitionParser("service", ne