web-dev-qa-db-fra.com

Classe Spring Autowiring vs interface?

J'ai cette configuration de printemps:

<bean id="boo" class="com.x.TheClass"/>

La classe TheClass implémente TheInterface. Ensuite, j'ai ce (hypothétique) Java code:

@Autowired
TheInterface x;

@Autowired
TheClass y;

Le câblage automatique de TheInterface fonctionne mais le câblage automatique de TheClass échoue. Le printemps me donne un NoSuchBeanDefinitionException pour la classe.

Pourquoi pouvez-vous câbler l'interface et non la classe?

43
Marcus Leon

Normalement, les deux fonctionnent, vous pouvez câbler automatiquement des interfaces ou des classes.

Il y a probablement un générateur autoproxy quelque part dans votre contexte, qui enveloppe votre bean boo dans un objet proxy généré. Cet objet proxy implémentera TheInterface, mais ne sera pas un TheClass. Lorsque vous utilisez des autoproxies, vous devez programmer sur l'interface, pas sur l'implémentation.

Le candidat probable est les proxys transactionnels - utilisez-vous des transactions Spring, utilisez AspectJ ou @Transactional?

56
skaffman