2

Я работаю над созданием библиотеки, построенной поверх весенних данных, чтобы она могла динамически генерировать репозитории Spring Data. Я надеялся создать общую оболочку этого процесса, которая работает с абстракцией Spring Data.Динамическое создание Spring Data Repositories

Этот способ зависит от того, какая зависимость добавлена ​​в пример пути к классам: spring-data-jpa или spring-data-mongodb Я мог бы генерировать репозитории и вводить их в свой весенний контекст.

У меня возникли проблемы с поиском хорошей документации о том, как это сделать. Есть идеи?

+0

Я имею в виду весенний ботинок для вас. Любая причина не использовать это? – Veeram

ответ

3

Весна представляет собой аннотацию @Conditional для контроля того, какие бобы/конфигурации выбраны в зависимости от пути к классам (аналогично автоконфигурации spring-boot).

Вы можете определить два класса конфигурации, которые выбираются весной на основе вашего пути к классам. Например:

  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 
    
         } 
        } 
    } 
    

Все, что вам нужно сделать, начиная с этого момента, чтобы использовать оба класса конфигурации в модуле, и пусть весна сделать это волшебство

+0

Хорошо, это доставляет мне большую часть пути. Удивительный пример! Последняя часть, которую я не совсем понимаю, заключается в том, как создать репозиторий данных весны, а затем ввести его в весенний контекст. Пример. Если mongodb находится в пути к классам, создайте N количество репозиториев данных весны и введите их в контекст весеннего приложения. Эта проблема означает создание репозиториев, которые зависят от зависимости spring-data-mongodb или от зависимости JPA, в зависимости от того, какая из них находится на пути к классам. –

+0

Репозитории создаются автоматически, если найдена аннотация '@ Enable..Repository'. Все бобы, реализующие интерфейсы '* Repository' (' CrudRepository', 'PagingAndSortingRepository'), будут зарегистрированы в контексте весеннего приложения и доступны для автоустройства. –

+0

Удивительный спасибо Алекс! –

Смежные вопросы