您好,登錄后才能下訂單哦!
這篇文章主要介紹“dubbo中DubboApplicationContextInitializer的具體用法”,在日常操作中,相信很多人在dubbo中DubboApplicationContextInitializer的具體用法問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”dubbo中DubboApplicationContextInitializer的具體用法”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
dubbo-spring-boot-project-2.7.3/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/context/DubboApplicationContextInitializer.java
public class DubboApplicationContextInitializer implements ApplicationContextInitializer, Ordered { @Override public void initialize(ConfigurableApplicationContext applicationContext) { overrideBeanDefinitions(applicationContext); } private void overrideBeanDefinitions(ConfigurableApplicationContext applicationContext) { applicationContext.addBeanFactoryPostProcessor(new OverrideBeanDefinitionRegistryPostProcessor()); applicationContext.addBeanFactoryPostProcessor(new DubboConfigBeanDefinitionConflictProcessor()); } @Override public int getOrder() { return HIGHEST_PRECEDENCE; } }
DubboApplicationContextInitializer實(shí)現(xiàn)了ApplicationContextInitializer, Ordered接口,initialize方法執(zhí)行overrideBeanDefinitions,它往applicationContext添加了OverrideBeanDefinitionRegistryPostProcessor、DubboConfigBeanDefinitionConflictProcessor;getOrder返回的是HIGHEST_PRECEDENCE
dubbo-spring-boot-project-2.7.3/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/beans/factory/config/OverrideBeanDefinitionRegistryPostProcessor.java
public class OverrideBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { registerInfrastructureBean(registry, BEAN_NAME, DubboConfigBeanCustomizer.class); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { } }
OverrideBeanDefinitionRegistryPostProcessor實(shí)現(xiàn)了BeanDefinitionRegistryPostProcessor接口,其postProcessBeanDefinitionRegistry方法調(diào)用了BeanRegistrar.registerInfrastructureBean方法注冊(cè)DubboConfigBeanCustomizer
dubbo-2.7.3-sources.jar!/org/apache/dubbo/config/spring/util/BeanRegistrar.java
public class BeanRegistrar { /** * Register Infrastructure Bean * * @param beanDefinitionRegistry {@link BeanDefinitionRegistry} * @param beanType the type of bean * @param beanName the name of bean */ public static void registerInfrastructureBean(BeanDefinitionRegistry beanDefinitionRegistry, String beanName, Class<?> beanType) { if (!beanDefinitionRegistry.containsBeanDefinition(beanName)) { RootBeanDefinition beanDefinition = new RootBeanDefinition(beanType); beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); beanDefinitionRegistry.registerBeanDefinition(beanName, beanDefinition); } } }
registerInfrastructureBean在beanDefinitionRegistry沒(méi)有該beanDefinition的情況下會(huì)注冊(cè)BeanDefinition.ROLE_INFRASTRUCTURE的bean
dubbo-spring-boot-project-2.7.3/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/beans/factory/config/DubboConfigBeanCustomizer.java
@Deprecated class DubboConfigBeanCustomizer extends NamePropertyDefaultValueDubboConfigBeanCustomizer { @Override public void customize(String beanName, AbstractConfig dubboConfigBean) { boolean valid = isValidPropertyName(dubboConfigBean, beanName); if (valid) { super.customize(beanName, dubboConfigBean); } } private boolean isValidPropertyName(AbstractConfig dubboConfigBean, String propertyValue) { boolean valid = true; String propertyName = "name"; // AbstractConfig.checkName(String,String) Method method = findMethod(AbstractConfig.class, "checkName", String.class, String.class); try { if (!method.isAccessible()) { method.setAccessible(true); } if (BeanUtils.getPropertyDescriptor(dubboConfigBean.getClass(), propertyName) != null) { invokeMethod(method, null, propertyName, propertyValue); } } catch (IllegalStateException e) { valid = false; } return valid; } }
DubboConfigBeanCustomizer繼承了NamePropertyDefaultValueDubboConfigBeanCustomizer,其customize方法會(huì)先校驗(yàn)propertyName,在valid的情況下才會(huì)執(zhí)行父類的customize方法
dubbo-spring-boot-project-2.7.3/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/beans/factory/config/DubboConfigBeanDefinitionConflictProcessor.java
public class DubboConfigBeanDefinitionConflictProcessor implements BeanDefinitionRegistryPostProcessor, Ordered { private final Logger logger = LoggerFactory.getLogger(getClass()); private BeanDefinitionRegistry registry; private Environment environment; @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { this.registry = registry; } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { resolveUniqueApplicationConfigBean(registry, beanFactory); } /** * Resolve the unique {@link ApplicationConfig} Bean * * @param registry {@link BeanDefinitionRegistry} instance * @param beanFactory {@link ConfigurableListableBeanFactory} instance * @see EnableDubboConfig */ private void resolveUniqueApplicationConfigBean(BeanDefinitionRegistry registry, ConfigurableListableBeanFactory beanFactory) { this.environment = beanFactory.getBean(ENVIRONMENT_BEAN_NAME, Environment.class); String[] beansNames = beanNamesForTypeIncludingAncestors(beanFactory, ApplicationConfig.class); if (beansNames.length < 2) { // If the number of ApplicationConfig beans is less than two, return immediately. return; } // Remove ApplicationConfig Beans that are configured by "dubbo.application.*" Stream.of(beansNames) .filter(this::isConfiguredApplicationConfigBeanName) .forEach(registry::removeBeanDefinition); beansNames = beanNamesForTypeIncludingAncestors(beanFactory, ApplicationConfig.class); if (beansNames.length > 1) { throw new IllegalStateException(String.format("There are more than one instances of %s, whose bean definitions : %s", ApplicationConfig.class.getSimpleName(), Stream.of(beansNames) .map(registry::getBeanDefinition) .collect(Collectors.toList())) ); } } private boolean isConfiguredApplicationConfigBeanName(String beanName) { boolean removed = BeanFactoryUtils.isGeneratedBeanName(beanName) // Dubbo ApplicationConfig id as bean name || Objects.equals(beanName, environment.getProperty("dubbo.application.id")); if (removed) { if (logger.isWarnEnabled()) { logger.warn("The {} bean [ name : {} ] has been removed!", ApplicationConfig.class.getSimpleName(), beanName); } } return removed; } @Override public int getOrder() { return LOWEST_PRECEDENCE; } }
DubboConfigBeanDefinitionConflictProcessor實(shí)現(xiàn)了BeanDefinitionRegistryPostProcessor, Ordered接口;postProcessBeanFactory方法會(huì)執(zhí)行resolveUniqueApplicationConfigBean,校驗(yàn)同一個(gè)beanDefinition是否會(huì)有多個(gè)實(shí)例,有的話會(huì)拋出IllegalStateException;getOrder返回的是LOWEST_PRECEDENCE
DubboApplicationContextInitializer實(shí)現(xiàn)了ApplicationContextInitializer, Ordered接口,initialize方法執(zhí)行overrideBeanDefinitions,它往applicationContext添加了OverrideBeanDefinitionRegistryPostProcessor、DubboConfigBeanDefinitionConflictProcessor;getOrder返回的是HIGHEST_PRECEDENCE
到此,關(guān)于“dubbo中DubboApplicationContextInitializer的具體用法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。