基于@Prabhakar D评论,我将根据我的需要发布我的答案(除了@enablemongorepositionals和其他一些小修改外,还将使用@enablejparepositionals)
在@EnableJpaRepositories注释中,添加repositoryFactoryBeanClass:
@EnableJpaRepositories(basePackages = "my.base.pkg", repositoryBaseClass = RepositoryBaseImpl.class, repositoryFactoryBeanClass = MyRepositoryFactoryBean.class)
关键是,您可以在repositoryFactoryBeanClass中使用@Autowire
创建RepositoryFactoryBean类并在其中自动关联bean。这是一个SpringBean,它在重写的方法createRepositoryFactory中创建自定义JParePositionFactory:
public class MyRepositoryFactoryBean<T extends JpaRepository<S, ID>, S, ID extends Serializable> extends JpaRepositoryFactoryBean<T, S, ID> {
@Autowired
private MessageLocale messageLocale;
public MyRepositoryFactoryBean(Class repositoryInterface) {
super(repositoryInterface);
}
@Override
protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {
return new MyJpaRepositoryFactory(entityManager, messageLocale);
}
}
现在,创建自定义工厂(MyJpaRepositoryFactory)并使用覆盖的方法getTargetPository创建基本存储库的实例(RepositoryBaseImpl)。在这里,您可以将bean注入其构造函数:
public class MyJpaRepositoryFactory extends JpaRepositoryFactory {
private EntityManager entityManager;
private MessageLocale messageLocale;
public MyJpaRepositoryFactory(EntityManager entityManager, MessageLocale messageLocale) {
super(entityManager);
this.entityManager = entityManager;
this.messageLocale = messageLocale;
}
@Override
protected JpaRepositoryImplementation<?, ?> getTargetRepository(RepositoryInformation information, EntityManager entityManager) {
return new RepositoryBaseImpl(getEntityInformation(information.getDomainType()), entityManager, messageLocale);
}
}
现在,只需修改RepositoryBaseImpl的构造函数,使其可以接受所需的Bean:
public class RepositoryBaseImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements RepositoryBase<T, ID> {
private MessageLocale messageLocale;
private EntityManager entityManager;
public RepositoryBaseImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager, MessageLocale messageLocale) {
super(entityInformation, entityManager);
this.entityManager = entityManager;
this.messageLocale = messageLocale;
}
既然messageLocal被注入到BaseRepositoryImpl中,您就可以在自定义方法中使用它,而无需在参数中传递它
希望这能帮助别人