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é.
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 .
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.
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:
<bean class="package.EmpDao" />
<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
.
Spring utilise l'API CGLib pour fournir une injection de dépendance câblée automatiquement.