Spring Boot Как загрузить только указанные компоненты @Repository - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть проект, содержащий множество Dao, аннотированных @Repository каждый.

Также несколько проектов весенней загрузки, каждый из которых имеет свой контекст Spring, могут быть запущены независимо, и у них есть ссылка на проект, содержащий Daos.

Дело в том, что я не хочу загружать весь Дао в контекст весны в каждом проекте. Для каждого проекта весенней загрузки требуется только несколько указанных Dao.

Я использовал для указания классов Dao, определяя их как bean-компоненты в конфигурации XML для каждого проекта.

Теперь мы переходим к java и конфигурация на основе аннотаций.

Есть ли способ сообщить контексту пружины только о том, что я загружаю указанный @Repository?

Я знаю, что могу создать класс @Configuration и определить Методы @Bean, но мне все еще нужно, чтобы они рассматривались как @Repository, а не как обычный bean-компонент. Любая идея, если это поддерживается и как это реализовать?

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

Вы можете использовать @Conditional для каждого из этих классов DAO. Класс будет загружен в контексте только тогда, когда выполнено условие, упомянутое с помощью аннотации @Conditional. Вы можете иметь условие типа:

@ConditionalOnProperty(
    value="module.name", 
    havingValue = "module1", 
    matchIfMissing = false)
class DaoForModule1 {

Это загрузит DaoModule1 тогда и только тогда, когда свойство module.name имеет значение module1. Если вы хотите загрузить это DaoModule1, когда proerty не установлен, вы можете изменить matchIfMissing на true.

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

@Profile("module2")
class DaoForModule2 {

Это загрузит DaoForModule2, только если у вас есть module2 в списке активных профилей. Но я не предпочел бы профиль, поскольку случай использования профилей отличается. Обычно мы используем профили для указания переменных ресурсов в зависимости от среды.

1 голос
/ 13 февраля 2020

Исходя из вашего вопроса, я предполагаю, что вы хотите повторно использовать проект Spring DAO с несколькими репозиториями и объектами JPA Entity, возможно принадлежащими к различным источникам данных, в нескольких других проектах Spring. Вы предпочитаете загружать только определенный c набор объектов / репозиториев JPA. Первым шагом является организация связанных объектов и репозиториев в отдельные пакеты и включение этого проекта в путь других проектов.

Это один из способов справиться с этим, предполагая, что вы разделили репозитории и объекты на разные пакеты. Создайте свой собственный компонент конфигурации, который будет создавать экземпляр компонента JPA EntityManagerFactory с указанными c пакетами и необходимым источником данных. в этом коде ниже, EntityManagerFactory ниже загрузит объекты из MODEL_PACKAGE и репозитории из REPOSITORIES_PACKAGE.

@Configuration
@ComponentScan(basePackages = MODEL_PACKAGE)
@EnableJpaRepositories(basePackages = REPOSITORIES_PACKAGE,
        entityManagerFactoryRef = "ENTITY_MANAGER_FACTORY")
@EnableTransactionManagement
public class PersistenceConfig {

    public static final String MODEL_PACKAGE = "Your model package";
    public static final String REPOSITORIES_PACKAGE = "Your repository package";

        public static final String ENTITY_MANAGER_FACTORY = "entity_manager_factory";
    public static final String TRANSACTION_MANAGER = "transaction_manager";

    @Autowired //This is to get your property file entries (DB connection, etc).
    private Environment environment;

    @Bean(DATA_SOURCE)
    public DataSource dataSource() {
        //Create your datasource from environment properties.  Example - org.apache.tomcat.jdbc.pool.DataSource
    }

    @Bean(ENTITY_MANAGER_FACTORY) @Autowired
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            @Qualifier(DATA_SOURCE) DataSource dataSource) throws IllegalStateException  {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource);
        Properties jpaProperties = new Properties();
        // set properties for your JPA, for example, hibernate.dialect, hibernate.format_sql, etc.

        entityManagerFactoryBean.setJpaProperties(jpaProperties);
        entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        entityManagerFactoryBean.setPackagesToScan(MODEL_PACKAGE);
    }

    @Bean(TRANSACTION_MANAGER) @Autowired
    @Primary
    @Qualifier(value = "transactionManager")
    public JpaTransactionManager transactionManager(
            @Qualifier(ENTITY_MANAGER_FACTORY) EntityManagerFactory entityManagerFactory) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();    
        transactionManager.setEntityManagerFactory(entityManagerFactory);    
        return transactionManager;
0 голосов
/ 13 февраля 2020

@SpringBootApplication просто объединить @EnableAutoConfiguration, @SpringBootConfiguration и @ComponentScan.

@ComponentScan - это парень, который заставляет все бины @Repository в отсканированном пакете автоматически регистрироваться, что то, что вы не хотите, чтобы это произошло.

Таким образом, вы можете использовать эти аннотации отдельно, но исключая @ComponentScan. И используйте @Import для явного определения bean-компонентов, которые вы хотите зарегистрировать.

Основной класс приложения будет выглядеть так:

@SpringBootConfiguration
@EnableAutoConfiguration
@Import(value = {FooRepoistory.class, BarRepository.class,.......})
public class Application {

    public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...