Sping Boot custom starter和Spring Data JPA -如何在我自己的自定义autoconfigure/starter模块上正确提供存储库

pgccezyw  于 2023-10-20  发布在  Spring
关注(0)|答案(1)|浏览(119)

我正在尝试为我的一个项目写一个自动配置/启动器模块。此模块通过Spring Data JPA处理持久性。它旨在提供多个Spring Data 库。
现在,我的自动配置看起来像这样:

@Configuration(proxyBeanMethods = false)
@AutoConfigureAfter(JpaRepositoriesAutoConfiguration::class)
@EnableJpaRepositories(basePackageClasses = [ItemRepository::class])
@EntityScan(basePackageClasses = [ItemRepository::class])
class DomainPersistenceDataJpaAutoConfiguration() {

}

正如spring Boot 参考文档中所述,自动配置不应该启用组件扫描,尽管@EnableJpaRepositories使用组件扫描。
什么是好的替代方法?是否有任何现有的spring Boot start的例子可以提供我可以参考的存储库实现?

hc2pp10m

hc2pp10m1#

你要找的可能是Autoconfiguration Packages #register方法,我认为常用的方法是实现ImportBeanDefinitionRegistrar,然后使用@Import在自动配置中导入这个实现。在Axon框架的RegisterDefaultEntities注解和它导入的DefaultEntityRegistrar中可以看到一个非常优雅的解决方案。这样你的包就会被包含在jpa和实体扫描中。
编辑:添加实际的例子,因为正如评论指出的那样,链接可能会随着时间的推移而改变。
在您的情况下,ImportBeanDecisionRegistrar可能看起来像这样:

import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.boot.autoconfigure.AutoConfigurationPackages;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata; 

public class StarterEntityRegistrar implements ImportBeanDefinitionRegistrar {

   @Override
   public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
      AutoConfigurationPackages.register(registry, ItemRepository.class.getPackageName());
   }
}

你的自动配置就只是:

@Configuration(proxyBeanMethods = false)
@AutoConfigureAfter(JpaRepositoriesAutoConfiguration.class)
@Import(StarterEntityRegistrar.class)
class DomainPersistenceDataJpaAutoConfiguration() {

}

相关问题