【问题标题】:Dynamically generating Spring Data Repositories动态生成 Spring Data Repository
【发布时间】:2016-12-20 12:26:58
【问题描述】:

我正在创建一个基于 spring-data 的库,以便它能够动态生成 Spring Data 存储库。我希望创建一个在 Spring Data 抽象上运行的过程的通用包装器。

这种方式取决于添加到类路径示例的依赖项:spring-data-jpaspring-data-mongodb 我将能够生成存储库并将它们注入到我的 spring 上下文中。

我很难找到有关如何执行此操作的良好文档。有什么想法吗?

【问题讨论】:

  • 我的意思是弹簧靴为你做的。有什么理由不使用它?

标签: java spring spring-data spring-data-jpa spring-data-mongodb


【解决方案1】:

Spring 提供了一个 @Conditional 注释,用于控制根据类路径选择哪些 bean/配置(类似于 spring-boot 自动配置)。

您可以根据您的类路径定义两个由 spring 拾取的配置类。 例如:

  1. JPA 存在于类路径的配置可能类似于。

    @Configuration
    @EnableJpaRepositories(basePackages=...)
    @Conditional(JpaClassPathCondition.class)
    public class JpaAutoConfiguration {
    
        static class JpaClassPathCondition implements Condition {
    
            @Override
            public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
                return ClassUtils.isPresent("javax.persistence.EntityManager", JpaAutoConfiguration.class.getClassLoader());
            }
         }
    }
    
  2. MongoDB的配置:

    @Configuration
    @EnableMongoRepositories(...)
    @Conditional(MongoClassPathCondition.class)
    public class MongoAutoConfiguration {
    
        static class MongoClassPathCondition implements Condition {
    
            @Override
            public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
                return !ClassUtils.isPresent("javax.persistence.EntityManager", MongoAutoConfiguration.class.getClassLoader()); )//or whatever classpath element fits you best
    
            }
         }
    }
    

从现在开始,你需要做的就是在你的模块中使用这两个配置类,让 spring 来做这件事

【讨论】:

  • 好的,这让我大部分时间。很棒的例子!我不完全理解的最后一部分是如何创建一个 spring 数据存储库,然后将其注入到 spring 上下文中。示例:如果 mongodb 在类路径上,则创建 N 个 spring 数据存储库并将它们注入到 spring 应用程序上下文中。这个问题意味着创建依赖于 spring-data-mongodb 依赖或 JPA 依赖的存储库,具体取决于哪个在类路径上
  • 如果找到@Enable..Repository 注释,则会自动创建存储库。所有实现*Repository 接口(@98​​7654327@,PagingAndSortingRepository)的 bean 都将注册到 spring 应用程序上下文并可用于自动装配。
猜你喜欢
  • 2019-02-20
  • 1970-01-01
  • 2012-03-19
  • 2018-05-08
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多