Printemps 3.2 Autowire types génériques
J'ai donc un certain nombre de génériques au Printemps 3.2 et, idéalement, mon architecture ressemblerait à quelque chose comme ça.
class GenericDao<T>{}
class GenericService<T, T_DAO extends GenericDao<T>>
{
//FAILS
@Autowired
T_DAO;
}
@Component
class Foo{}
@Repository
class FooDao extends GenericDao<Foo>{}
@Service
FooService extends GenericService<Foo, FooDao>{}
Malheureusement, avec de multiples implémentations de l'génériques l'permettra à l'autowiring déclenche une erreur sur plusieurs correspondant bean définitions. Je suppose que c'est parce que @Autowired
processus avant type d'effacement. Chaque solution que j'ai trouvé ou venir avec des regards laid pour moi ou juste inexplicablement refuse de travailler. Quelle est la meilleure façon de contourner ce problème?
- Avez-vous essayé avec le déplacement
@Autowired
annotation de setter? - Avez-vous essayé d'utiliser un
@Qualifier
avec l'annotation pour spécifier la mise en œuvre de la version que vous voulez? - Votre rencontre type erasure. Ces questions peuvent vous être utile: (1), (2).
- stackoverflow.com/questions/15002836/...
- Juste une remarque: les génériques sont seulement compilation de sucre. Ils n'existe pas dans l'exécution. Lorsque vous avez besoin pour construire votre objet, vous n'avez pas toutes les informations à ce sujet...
- Dès le Printemps 4, il est possible de autowire par type générique, voir mettre à jour dans ma réponse.
Vous devez vous connecter pour publier un commentaire.
Comment sur l'ajout d'un constructeur à l'
GenericService
et déplacer l'permettra à l'autowiring à l'extension de la classe, par exempleMise à jour:
De Printemps 4.0 RC1, il est possible de autowire basé sur le type générique, ce qui signifie que vous peut écrire un service générique comme
et de créer plusieurs types de beans Spring comme:
Vous pouvez supprimer le @autowire d'annotation et d'effectuer en retard “autowire” à l'aide de @PostConstruct et ServiceLocatorFactoryBean.
Votre GenericService va ressembler à ceci
daoLocatorFactoryBean fait la magie pour vous.
Pour l'utiliser, vous devez ajouter une interface similaire à celui ci-dessous:
Vous devez ajouter le code suivant à votre applicationContext.xml
C'est un bon truc, et il vous fera économiser un peu passe-partout de classes.
B. T. W, je ne vois pas ce code réutilisable comme un gros problème et le projet sur lequel je travail pour des utilisations matsev approche.
Ici est plus proche de la solution. Spécialisés DAOs sont annotés à la couche de gestion. Comme dans la question de l'OP, le mieux serait d'avoir une annoté DAO dans le EntityDAO modèle générique de lui-même. Type d'effacement semble ne permettant pas le type spécialisé de l'information pour obtenir transmis sur le ressort des usines [résultant dans les rapports de correspondance des haricots de toutes les spécialités DAOs]
Le Générique de l'Entité DAO modèle
Le Générique De L'Entité De La Couche De Gestion Modèle De
Un Exemple Entité Spécialisée, DAO
Un Exemple Entité Spécialisée En Classe Affaires
Pourquoi voulez-vous un service générique ? Les classes de Service sont destinées à des unités spécifiques de travail impliquant plusieurs entités. Vous pouvez simplement injecter un dépôt directement dans un contrôleur.
Voici un exemple de générique référentiel avec l'argument du constructeur, vous pouvez également faire de chaque méthode Générique à la place et n'ont pas d'argument du constructeur. Mais chaque appel de méthode nécessiterait la classe comme paramètre:
Exemple de bean définition pour le générique dépôt - vous pouvez avoir plusieurs différentes fèves, à l'aide de différents constructeur args.
Depdncy injection de fèves à l'aide des ressources de l'annotation
Et cela permet à l'Domainreposiroty d'être sous-classé pour certaines entités ou à des méthodes, qui woul dallow permettra à l'autowiring :
Vous devez utiliser permettra à l'autowiring dans les classes qui s'étend de ces génériques
Pour cette question, on a besoin de comprendre ce que autowire est. En termes courants, nous pouvons dire que grâce à autowire nous créons une instance de l'objet ou de fèves au moment du déploiement de l'application web. Alors maintenant, allez à la question de savoir si vous êtes déclarant permettra à l'autowiring en plusieurs endroits avec le même nom. Ensuite, cette erreur vient. Permettra à l'autowiring peut être fait de plusieurs façons donc, si vous utilisez plusieurs type de permettra à l'autowiring de la technique, et puis aussi, on pourrait avoir cette erreur.
Complet Solution Générique à l'aide de Printemps 4:
Domaine Classe
DAO Couche
De La Couche De Service