当前位置: 首页 > 知识库问答 >
问题:

Spring数据JPA配置的模块化

巫马自明
2023-03-14

我们正在寻找不同模块分别指定@ComponentScan、@EnableJpaRepositories和EntityManagerFactory的方法。setPackagesToScan。

我们将多个代码模块组合到Web应用程序中。此外,我们允许对基本代码进行客户特定的扩展,可以添加额外的包。在我的测试中,我发现我可以添加一个额外的java配置类,并且在@ComponentScan和@EnableJpaRepository中添加了额外的包。我在想,如果我可以使用@EntityScan,我会看到类似的行为。

但是,我们正在EntityManagerFactory中执行一些定制,因此@EntityScan不再是一个选项。我认为我们不想为每个模块指定另一个EntityManagerFactory。方法setPacakgesToScan执行包的替换(而不是添加到当前列表)。

已经有很多关于有问题地设置包的能力的帖子ToScan,但这似乎大大增加了复杂性。

基本配置类示例

@Configuration
@EnableJpaRepositories(basePackages = { 
        "a", "b", "c"
 }
,repositoryFactoryBeanClass = BaseRepositoryFactoryBean.class
)
@ComponentScan(basePackages = {
        "a", "b", "c"
}
)
public class BaseConfig {       
    @Bean
    public EntityManagerFactory entityManagerFactory() throws NamingException {
        LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
        emf.setJtaDataSource(dataSource());
        emf.setPackagesToScan(new String[] {"a", "b", "c"})
    }
}

扩展配置类示例

@Configuration
@EnableJpaRepositories(basePackages = { 
        "d"
 }
,repositoryFactoryBeanClass = BaseRepositoryFactoryBean.class
)
@ComponentScan(basePackages = {
        "d"
}
)
public class ExtensionConfig {      
    @Bean
    public EntityManagerFactory entityManagerFactory() throws NamingException {
        LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
        emf.setJtaDataSource(dataSource());
        emf.setPackagesToScan(new String[] {"d"})
    }
}

有没有其他方法可以实现这种行为?

谢谢。

共有1个答案

嵇丰
2023-03-14

你可以尝试以下方法,尽管我不确定这是最好的方法:

为包列表创建一个持有人类。它必须可由客户端扩展模块访问:

public class EmfPackages {
    private final String[] packages;
    public EmfPackages(String[] packages) {
        this.packages = packages;
    }
    public String[] getPackages() {
        return this.packages;
    }
}

然后调整两个配置类:

public class BaseConfig {       
    @Bean
    public EMFPackages baseEmfPackages() {
        return new EmfPackages(new String[] {"a", "b", "c"});
    }    

    @Bean
    // both "holders" are now injected here
    // AFAIK this feature works in Spring 4+
    public EntityManagerFactory entityManagerFactory(List<EmfPackages> emfPackages) throws NamingException { 
        // actually this is Java 8+ style, adjust for lower versions if needed
        final String[] combinedPackages = emfPackages.stream()
            .flatMap(p -> Arrays.stream(p.getPackages()))
            .collect(Collectors.toList())
            .toArray(new String[0]{});

        LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
        emf.setJtaDataSource(dataSource());
        emf.setPackagesToScan(combinedPackages)
    }    
}

public class ExtensionConfig {      
    @Bean
    public EmfPackages extendedEmfPackages() {
        return new EmfPackages(new String[] {"d"});
    }
}
 类似资料:
  • 我正在开发Spring MVC Web应用程序,它使用JDBC Quartz Scheduler来执行作业。这个Web应用程序有多个服务,每个服务都打包为jar并具有关联的作业。我在Web项目中有一个石英配置,在该配置下我为作业、触发器和调度程序创建了bean。在调度程序配置下,我指定了触发器列表。当我们开始我们的项目时,这很好。随着我们开始添加功能,作业数量增加,现在大约有100个。维护这个文件

  • 尝试基于以下内容设置应用程序时出错:SPRING-DATA-JPA, GWT项目。尝试在托管模式下运行时出现异常: 嵌套在org.springframework.beans.factory.BeanCreationException:创建名称为org.springframework.dao.annotation.的bean时出错:bean初始化失败;嵌套异常是org.springframework

  • 我将spring项目和spring数据JPA拆分为多个模块 > 项目-根-文件夹 项目数据 src/main/java/project。测试/应用程序。爪哇 src/main/resources/log4j2。xml 波姆。xml src/main/java/project.test/App.java src/main/ressource/log4j2.xml pom.xml 项目根文件夹/pom

  • 我正在读《Web应用程序的专业Java——尼古拉斯·威廉姆斯》这本书的例子对Spring Data JPA有这样的配置: 但我一直在使用XML进行配置,我不知道如何仅将其转换为XML,到目前为止我已经有了这个 有谁能指导我如何转换这个吗? 谢谢

  • 一、简介 黄页模块的基本设置 二、基本设置 三、SEO设置 二、权限设置

  • SOFABoot 模块是一个普通的 Jar 包加上一些 SOFABoot 特有的配置,这些 SOFABoot 特有的配置,让一个 Jar 包能够被 SOFABoot 识别,使之具备模块化的能力。 一个完整的 SOFABoot 模块和一个普通的 Jar 包有两点区别: SOFABoot 模块包含一份 sofa-module.properties 文件,这份文件里面定义了 SOFABoot 模块的名称