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 obtenir des ensembles puisqu'il n'existe pas de méthodes de définition et il est privé.

44
demandé sur Anthony 2010-08-21 10:51:09

4 réponses

Java permet de désactiver les contrôles d'accès sur un champ ou une méthode (Oui, il y a un contrôle de sécurité à passer en premier) via la AccessibleObject.setAccessible() méthode qui fait partie du cadre de réflexion (à la fois Field et Method héritent de AccessibleObject ). Une fois que le champ peut être découvert et écrit, il est assez trivial de faire le reste de celui-ci; simplement une Simple question de programmation .

36
répondu Donal Fellows 2017-10-27 12:56:38

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

Check out ReflectionTestUtils , ce qui est très pratique pour écrire des tests unitaires.

6
répondu earldouglas 2010-08-21 16:03:43

pas besoin de setter, il suffit de déclarer la classe EmpDao avec l'annotation @component pour que Spring l'identifie comme faisant partie des components qui sont contenus dans L'ApplicationContext ...

vous avez 2 solutions:

  • déclarer manuellement vos haricots dans le contexte de l'application de fichier XML:

  • pour l'utilisation automatique détection en saisissant ces lignes dans votre fichier de contexte:

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

< context: annotation-config / >

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

ex:

@Component
class EmpDao {...}

et pour annoter sa référence par @Autowired:

@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();
}
...
}

Autowiring se produit en plaçant une instance d'un haricot dans le champ désiré dans une instance d'un autre haricot. Les deux classes devraient être des haricots, c'est-à-dire qu'elles devraient être définies comme vivant dans le contexte de l'application.

Le printemps connaît L'existence des haricots EmpDao et MyClass et instanciera automatiquement une instance D'EmpDao dans MyClass

4
répondu MrJavaJEE 2013-01-29 09:58:15
1
répondu krock 2010-08-25 22:44:35