J'ai essayé le code suivant avec Spring 3.x qui a échoué avec BeanNotFoundException
et il devrait selon les réponses d'une question que j'ai posée auparavant - Puis-je injecter la même classe en utilisant Spring ?
@Service
public class UserService implements Service{
@Autowired
private Service self;
}
Comme j'essayais ceci avec Java 6, j'ai trouvé que le code suivant fonctionne bien :
@Service(value = "someService")
public class UserService implements Service{
@Resource(name = "someService")
private Service self;
}
mais je ne comprends pas comment il résout la dépendance cyclique.
EDITAR:
Voici le message d'erreur. L'OP l'a mentionné dans un commentaire sur l'une des réponses :
Causé par : org.springframework.beans.factory.NoSuchBeanDefinitionException : No matching bean of type [com.spring.service.Service] found for dependency : expected at least 1 bean which qualifies as autowire candidate for this dependency. Annotations de dépendance : {@org.springframework.beans.factory.annotation.Autowired(required=true)}
3 votes
Question bonus : quel est le but de l'auto-injection ici ?
0 votes
@OrkunOzen Cas d'utilisation simple : vous voulez
@Transactional
pour fonctionner correctement sur les invocations d'une autre méthode de la même classe depuis l'intérieur. Appelerthis.myMethod()
ignorerait la transaction, maisself.myMethod()
devrait avoir la transaction créée. Voir Section 5.1. Pièges potentiels - Transactions et procurations .0 votes
@Snackoverflow, une autre question bonus : comment le this.myMethod() ignorer la transaction ?
0 votes
@GB11 AFAIK quand la méthode est annotée avec
@Transactional
et la classe est@Autowired
en tant que dépendance, Spring injecte alors une instance de proxy qui englobe votre instance de classe, et dans l'implémentation du proxy, la méthode est également englobée par une méthode de proxy avec une logique de transaction. Si vous utilisezthis.myMethod()
directement, vous le faites de l'intérieur l'instance de votre classe code, référencement la méthode d'instance de votre classe et ne pas appeler le proxy injecté avec la logique de transaction. spring.io/blog/2012/05/23/…0 votes
@GB11 Voici une autre source ; Documentation Spring : 8.6 Mécanismes de proxy (c'est une lecture courte)