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

Spring Boot如何仅加载指定的@Repository组件

长孙阳州
2023-03-14

我有一个包含许多道的项目,每个都由@Repository注释。

还有几个Spring Boot项目,每个项目都有其Spring上下文,可以独立运行,并且它们有对包含Daos的项目的引用。

问题是,我不想在每个项目中将所有的道加载到Spring上下文中。每个Spring启动项目只需要一些指定的道。

我曾经通过在每个项目的XML配置中将Dao类定义为bean来指定Dao类。

现在,我们将转向基于java和注释的配置。

有没有一种方法可以告诉Spring上下文只加载我指定的@Repository?

我知道我可以创建@Configuration类并定义@Bean方法,但我仍然需要将它们视为@Repository,而不是普通的Bean。是否支持这一点,以及如何实现这一点?

共有3个答案

赵奕
2023-03-14

将SpringBootApplication、EnableAutoConfiguration、SpringBootConfiguration和ComponentScan三者结合起来即可。

@ComponentScan是导致扫描包下的所有@Repositorybean自动注册的人,这是您不希望发生的事情。

因此,您可以单独使用这些注释,但不包括@ComponentScan。并使用@导入显式定义要注册的bean。

主要应用程序类如下所示:

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

    public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
    }
}
阴福
2023-03-14

从您的问题中,我假设您希望在其他几个Spring项目中重用具有多个存储库和JPA Entity对象的Spring DAO项目,这些对象可能属于不同的数据源。您更喜欢只加载一组特定的JPA实体/存储库。第一步是将相关实体和存储库组织到不同的包中,并将此项目包含在其他项目的路径中。

假设您已将存储库和实体分离到不同的包中,这是处理此问题的一种方法。创建您自己的配置bean,该bean将用它所需的特定包和数据源实例化JPA EntityManagerFactorybean。在下面的代码中,下面的EntityManagerFactory将从MODEL\u包加载实体,并从repositories\u包加载存储库。

@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;
高博涉
2023-03-14

您可以在这些DAO类中的每一个上使用@Con合条件。只有当使用@Con合条件注释提到的条件得到满足时,类才会在上下文中加载。您可以具有以下条件:

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

当且仅当属性模块时,这将加载daommodule1。名称具有值模块1。如果要在未设置属性时加载此DAOMULET1,可以将matchIfMissing更改为true。

您还可以使用Profile注释来限制基于Profile加载的类

@Profile("module2")
class DaoForModule2 {

只有在活动概要文件列表中有模块2时,才会加载DaoForModule2。但是我不喜欢概要文件,因为概要文件的用例是不同的。我们通常使用概要文件来指定基于环境的可变资源。

 类似资料:
  • 我有数据保存在员工的Spring和“个人发展计划”中。可以说,员工是主导阶层。它看起来像这样: 个人发展计划如下: 在数据库中,它被存储为来自

  • 我有一个EAR文件,其中包含两个不同的jar,它们共享一些具有相同package.class名称的类。这些JAR部署在我的APP-INF/lib目录中。 假设A jar包含最新版本的类,B包含旧版本的类。当引用一个类时,Weblogic首先查看B jar并加载破坏某些功能的旧版本。 如何让Weblogic从APP-INF/lib中先加载jar A再加载B?我需要定义一个特定的顺序,以避免加载旧类。

  • 当我尝试打开下面的URL时,我确实看到了我的JSON响应。 http://localhost:8080/v3/api-docs

  • 如何才能实现这个功能?最好配合路由勾子实现,不然应该会在一个页面加载后,其他页面不点击刷新应该会一直保留加载的js

  • 问题内容: 如果名称和名称相同,默认情况下MapStruct将映射源和目标的所有属性。尽管我们可以在@Mapping中使用ignore属性来省略任何字段映射。但这不是我想要的。我想控制映射策略。我必须指定类似 现在此映射仅用于将ID和名称从源映射到目标。除非在映射注释中指定,否则不应映射其他字段。 问题答案: 您正在寻找的是#1392中 的功能请求。有一个待定的PR,因此可以在下一版本(1.3.0

  • 我正在使用Spring数据为我的应用程序获取数据。 repository类使用mongo实体类,该实体类作为上游依赖项添加到我的项目中,这意味着我无法控制更改该类的源代码。因此,我无法使用组织中的文档注释。springframework。数据mongodb。果心映射到我的mongo实体类。 在这里,我对Dummy类的源代码没有任何控制权,因此我无法添加文档来指定该类的集合名称 如何在使用查询mon