52 votes

Comment fonctionne Spring @Autowired

Je suis tombé sur un exemple de @Autowired

 public class EmpManager {
   @Autowired
   private EmpDao empDao;
}
 

J'étais curieux de savoir comment l'empDao obtient des ensembles car il n'y a pas de méthodes de définition et c'est privé.

46voto

Donal Fellows Points 56559

Java permet de contrôles d'accès sur un champ ou une méthode pour être désactivées (oui, il y a un contrôle de sécurité à passer d'abord) par l'intermédiaire de l' AccessibleObject.setAccessible() méthode qui fait partie du cadre de réflexion (les deux Field et Method hériter d' AccessibleObject). Un le terrain à la découverte et à l'écrit, c'est assez trivial à faire le reste, il suffit d'une Simple Question De Programmation.

7voto

James Points 5907

Java vous permet d'interagir avec des membres privés d'une classe via la réflexion.

Consultez ReflectionTestUtils , qui est très pratique pour écrire des tests unitaires.

4voto

MrJavaJEE Points 21

Pas besoin de setter, il vous suffit de déclarer la Classe EmpDao avec l'annotation @component afin que le Printemps identifie comme faisant partie des composants qui sont contenues dans l'ApplicationContext ...

Vous avez 2 solutions:

  • À déclarer manuellement vos haricots dans le fichier XML applicationContext:

  • Pour utiliser la détection automatique par seeting ces lignes dans votre fichier de contexte:

< context:component-scan de la base-package="package"/>

< context:annotation-config/>

ET utiliser au printemps annotation pour déclarer les classes que votre printemps conteneur sera de gérer comme composants

ex:

@Component
class EmpDao {...}

ET à annoter son de référence par @Autocâblés:

@Component (or @Controller, or @Service...)
class myClass {

// tells the application context to inject an instance of EmpDao here
@Autowired
EmpDao empDao;


public void useMyDao()
{
    empDao.method();
}
...
}

Permettra à l'autowiring arrive en plaçant une instance d'un bean dans le champ souhaité dans une instance d'un autre bean. Les deux classes devraient être les haricots, c'est à dire qu'ils doivent être définies afin de vivre dans le contexte de l'application.

Printemps connaît l'existence des haricots EmpDao et MyClass et va instancier automatiquement une instance de EmpDao dans MyClass

1voto

krock Points 13537

Spring utilise le CGLib API pour fournir autocâblés l'injection de dépendance.


Références

Lectures Complémentaires

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X