You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在非托管类MyCustomRepository中获取Spring配置属性的方案咨询

解决方案

方案一:自定义RepositoryFactoryBean注入配置属性

Spring Data JPA允许通过自定义RepositoryFactoryBean控制仓库实例的创建过程,这是最规范且可复用的解决方案,无需依赖静态上下文。

步骤1:实现自定义RepositoryFactoryBean

创建继承自JpaRepositoryFactoryBean的类,通过构造方法注入@ConfigurationProperties Bean,并重写仓库工厂的创建逻辑,将配置属性传递给自定义仓库基类:

public class CustomRepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable>
        extends JpaRepositoryFactoryBean<T, S, ID> {

    private final MyConfigProperties configProperties;

    // 构造方法注入配置属性,Spring自动处理该Bean的依赖注入
    public CustomRepositoryFactoryBean(Class<? extends T> repositoryInterface, MyConfigProperties configProperties) {
        super(repositoryInterface);
        this.configProperties = configProperties;
    }

    @Override
    protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {
        return new CustomRepositoryFactory(entityManager, configProperties);
    }

    // 自定义仓库工厂,负责创建自定义仓库实例
    private static class CustomRepositoryFactory extends JpaRepositoryFactory {
        private final MyConfigProperties configProperties;

        public CustomRepositoryFactory(EntityManager entityManager, MyConfigProperties configProperties) {
            super(entityManager);
            this.configProperties = configProperties;
        }

        @Override
        protected Object getTargetRepository(RepositoryInformation information) {
            // 调用自定义仓库构造方法,传入EntityManager、实体类类型和配置属性
            return new MyCustomRepository<>(getEntityManager(), information.getDomainType(), configProperties);
        }

        @Override
        protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
            return MyCustomRepository.class;
        }
    }
}

步骤2:修改@EnableJpaRepositories配置

在JPA配置类中,指定repositoryFactoryBeanClass为自定义的工厂类:

@Configuration
@EnableJpaRepositories(
    basePackages = "xxx",
    entityManagerFactoryRef = "xxx",
    repositoryBaseClass = MyCustomRepository.class,
    transactionManagerRef = "xxx",
    repositoryFactoryBeanClass = CustomRepositoryFactoryBean.class) // 新增该行

步骤3:调整自定义仓库的构造方法

确保MyCustomRepository的构造方法包含配置属性参数,同时保留JPA仓库基类要求的签名:

public class MyCustomRepository<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> {
    private final MyConfigProperties configProperties;

    // 构造方法兼容JPA仓库基础参数,同时接收配置属性
    public MyCustomRepository(EntityManager entityManager, Class<T> domainClass, MyConfigProperties configProperties) {
        super(domainClass, entityManager);
        this.configProperties = configProperties;
        // 在此处即可使用配置属性
    }

    // 自定义仓库方法逻辑...
}

方案优势

  • 完全基于Spring Data JPA扩展机制,无hack式静态上下文依赖
  • 高度复用:可将自定义仓库基类、工厂Bean和配置属性类打包成独立Jar包/Starter,其他项目引入后仅需配置@EnableJpaRepositories即可使用
  • 依赖注入由Spring管理,初始化顺序有保障

补充说明

确保MyConfigProperties类已正确配置:

@ConfigurationProperties(prefix = "my.custom.config")
public class MyConfigProperties {
    // 配置属性字段及getter/setter
    private String someProperty;

    // getter、setter...
}

并在配置类中启用配置属性:

@Configuration
@EnableConfigurationProperties(MyConfigProperties.class)
public class ConfigPropertiesConfig {
}

内容的提问来源于stack exchange,提问作者SledgeHammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 08:32:32