Dans le @Enable...Repository
spécifient un repositoryBaseClass
y repositoryFactoryBeanClass
. Comme ça :
@EnableMongoRepositories(
repositoryBaseClass = MyBaseClass.class,
repositoryFactoryBeanClass = MyRepositoryFactoryBean.class)
Dans ce RepositoryFactoryBean
vous pouvez utiliser l'injection de dépendance normale, car il s'agit d'un Spring Bean, donc, par exemple, vous pouvez obtenir une instance de SomeBean
injecté via le constructeur, comme indiqué ci-dessous :
public class MyRepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable> extends MongoRepositoryFactoryBean<T,S,ID>{
private final SomeBean bean;
public MyRepositoryFactoryBean(Class repositoryInterface, SomeBean bean) {
super(repositoryInterface);
this.bean = bean;
}
}
Votre RepositoryFactoryBean
crée maintenant une instance d'une RepositoryFactory
en écrasant "getFactoryInstance".
@Override
protected RepositoryFactorySupport getFactoryInstance(MongoOperations operations) {
return new MyMongoRepositoryFactory(operations, bean);
}
Ce faisant, il peut transmettre le haricot à injecter. bean
dans l'exemple ci-dessus.
Et cette fabrique instancie finalement la classe de base de votre référentiel. La meilleure façon de procéder est probablement de tout déléguer à la classe de fabrique existante et d'ajouter simplement l'injection de la dépendance au mélange :
public class MyMongoRepositoryFactory extends MongoRepositoryFactory {
private final SomeBean bean;
MyMongoRepositoryFactory(MongoOperations mongoOperations, SomeBean bean) {
super(mongoOperations);
this.bean = bean;
}
@Override
protected Object getTargetRepository(RepositoryInformation information) {
Object targetRepository = super.getTargetRepository(information);
if (targetRepository instanceof MyBaseClass) {
((MyBaseClass) targetRepository).setSomeBean(bean);
}
return targetRepository;
}
}
Il existe un exemple complet et fonctionnel sur Github .