public BeanDefinition parse(Element element, ParserContext parser) { try { XmlRepositoryConfigurationSource configSource = new XmlRepositoryConfigurationSource(element, parser); for (RepositoryConfiguration<XmlRepositoryConfigurationSource> config : extension.getRepositoryConfigurations( configSource, parser.getReaderContext().getResourceLoader())) { registerGenericRepositoryFactoryBean(config, parser); } extension.registerBeansForRoot(parser.getRegistry(), configSource); } catch (RuntimeException e) { handleError(e, element, parser.getReaderContext()); } return null; }
@Override public String getRepositoryFactoryBeanClassName() { return configurationSource.getRepositoryFactoryBeanClassName() .orElseGet(() -> extension.getRepositoryFactoryBeanClassName()); }
extension.registerBeansForRoot(registry, configurationSource); .getRepositoryConfigurations(configurationSource, resourceLoader, inMultiStoreMode); extension.postProcess(definitionBuilder, configurationSource); extension.postProcess(definitionBuilder, (XmlRepositoryConfigurationSource) configurationSource); } else { extension.postProcess(definitionBuilder, (AnnotationRepositoryConfigurationSource) configurationSource); LOG.trace(REPOSITORY_REGISTRATION, extension.getModuleName(), beanName, configuration.getRepositoryInterface(), configuration.getRepositoryFactoryBeanClassName());
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) { Assert.notNull(annotationMetadata); Assert.notNull(registry); // Guard against calls for sub-classes if (annotationMetadata.getAnnotationAttributes(getAnnotation().getName()) == null) { return; } defaultExternalResources(registry); AnnotationRepositoryConfigurationSource configuration = new AnnotationRepositoryConfigurationSource( annotationMetadata, getAnnotation()); RepositoryConfigurationExtension extension = getExtension(); extension.registerBeansForRoot(registry, configuration); RepositoryBeanNameGenerator generator = new RepositoryBeanNameGenerator(); generator.setBeanClassLoader(beanClassLoader); for (RepositoryConfiguration<AnnotationRepositoryConfigurationSource> repositoryConfiguration : extension .getRepositoryConfigurations(configuration, resourceLoader)) { RepositoryBeanDefinitionBuilder builder = new RepositoryBeanDefinitionBuilder(repositoryConfiguration, extension); BeanDefinitionBuilder definitionBuilder = builder.build(registry, resourceLoader); extension.postProcess(definitionBuilder, configuration); String beanName = generator.generateBeanName(definitionBuilder.getBeanDefinition(), registry); registry.registerBeanDefinition(beanName, definitionBuilder.getBeanDefinition()); } }
/** * Builds a new {@link BeanDefinitionBuilder} from the given {@link BeanDefinitionRegistry} and {@link ResourceLoader} * . * * @param registry must not be {@literal null}. * @param resourceLoader must not be {@literal null}. * @return */ public BeanDefinitionBuilder build(BeanDefinitionRegistry registry, ResourceLoader resourceLoader) { Assert.notNull(registry, "BeanDefinitionRegistry must not be null!"); Assert.notNull(resourceLoader, "ResourceLoader must not be null!"); String factoryBeanName = configuration.getRepositoryFactoryBeanName(); factoryBeanName = StringUtils.hasText(factoryBeanName) ? factoryBeanName : extension .getRepositoryFactoryClassName(); BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(factoryBeanName); builder.addPropertyValue("repositoryInterface", configuration.getRepositoryInterface()); builder.addPropertyValue("queryLookupStrategyKey", configuration.getQueryLookupStrategyKey()); NamedQueriesBeanDefinitionBuilder definitionBuilder = new NamedQueriesBeanDefinitionBuilder( extension.getDefaultNamedQueryLocation()); if (StringUtils.hasText(configuration.getNamedQueriesLocation())) { definitionBuilder.setLocations(configuration.getNamedQueriesLocation()); } builder.addPropertyValue("namedQueries", definitionBuilder.build(configuration.getSource())); String customImplementationBeanName = registerCustomImplementation(registry, resourceLoader); if (customImplementationBeanName != null) { builder.addPropertyReference("customImplementation", customImplementationBeanName); builder.addDependsOn(customImplementationBeanName); } return builder; }
/** * Registers a generic repository factory bean for a bean with the given name and the provided configuration context. * * @param parser * @param name * @param context */ private void registerGenericRepositoryFactoryBean( RepositoryConfiguration<XmlRepositoryConfigurationSource> configuration, ParserContext parser) { RepositoryBeanDefinitionBuilder definitionBuilder = new RepositoryBeanDefinitionBuilder(configuration, extension); try { BeanDefinitionBuilder builder = definitionBuilder.build(parser.getRegistry(), parser.getReaderContext() .getResourceLoader()); extension.postProcess(builder, configuration.getConfigurationSource()); AbstractBeanDefinition beanDefinition = builder.getBeanDefinition(); beanDefinition.setSource(configuration.getSource()); RepositoryBeanNameGenerator generator = new RepositoryBeanNameGenerator(); generator.setBeanClassLoader(parser.getReaderContext().getBeanClassLoader()); String beanName = generator.generateBeanName(beanDefinition, parser.getRegistry()); if (LOG.isDebugEnabled()) { LOG.debug("Registering repository: " + beanName + " - Interface: " + configuration.getRepositoryInterface() + " - Factory: " + extension.getRepositoryFactoryClassName()); } BeanComponentDefinition definition = new BeanComponentDefinition(beanDefinition, beanName); parser.registerBeanComponent(definition); } catch (RuntimeException e) { handleError(e, configuration.getConfigurationSource().getElement(), parser.getReaderContext()); } }
extension.getDefaultNamedQueryLocation()); configuration.getNamedQueriesLocation().ifPresent(definitionBuilder::setLocations);