在非托管类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
相关产品推荐
相关产品推荐

