web-dev-qa-db-fra.com

Comment fonctionne l'annotation Spring @Autowired?

Je suis tombé sur un exemple de @Autowired:

public class EmpManager {
   @Autowired
   private EmpDao empDao;
}

J'étais curieux de savoir comment les empDao récupèrent les sets car il n'y a pas de méthodes setter et c'est privé.

47
Anthony

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 méthode AccessibleObject.setAccessible() qui fait partie du cadre de réflexion (les deux 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; simplement un Simple Matter Of Programming .

41
Donal Fellows

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

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

7
earldouglas

Pas besoin de setter, il suffit de déclarer la classe EmpDao avec l'annotation @component afin que Spring l'identifie comme faisant partie des composants contenus dans ApplicationContext ...

Vous avez 2 solutions:

  • Pour déclarer manuellement vos beans dans le fichier XML applicationContext:
<bean class="package.EmpDao" />
  • Pour utiliser la détection automatique en saisissant ces lignes dans votre fichier de contexte:
<context:component-scan base-package="package" />
<context:annotation-config />

ET pour utiliser l'annotation spring pour déclarer les classes que votre conteneur spring gérera comme composants:

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

Le câblage automatique se produit en plaçant une instance d'un bean dans le champ souhaité dans une instance d'un autre bean. Les deux classes doivent être des beans, c'est-à-dire qu'elles doivent être définies pour vivre dans le contexte de l'application.

Spring connaît l'existence des beans EmpDao et MyClass et instanciera automatiquement une instance de EmpDao dans MyClass.

4
MrJavaJEE

Spring utilise l'API CGLib pour fournir une injection de dépendance câblée automatiquement.


Les références

Lectures complémentaires

1
krock