Cette page définit le vocabulaire de l’injection de dépendances tel que Vauban le matérialise. Le modèle est celui de la spec Jakarta CDI 4.1 ; les choix d’implémentation sont décrits dans Fonctionnement interne.
Bean
Un bean est une classe gérée par le container : son cycle de vie, sa résolution de dépendances et son scope sont contrôlés par Vauban.
Trois conditions suffisent pour qu’une classe devienne un bean Vauban :
-
La classe est annotée d’un scope (
@ApplicationScoped,@Singleton,@Dependent,@RequestScoped) ou d’un stéréotype. -
La classe est visible depuis le module
module-info.java(exportsou même module). -
La classe figure dans l’index produit par
vauban-indexerà la compilation.
À la compilation, chaque bean reçoit deux artefacts générés :
-
une
_Factory— implémenteBeanFactory<T>et sait instancier le bean ; -
un
_ClientProxy— uniquement pour les scopes normaux, intercepte les appels et délègue au contexte.
Scope
Un scope définit la durée de vie d’une instance et le contexte qui la stocke.
Scopes implémentés : voir la table d’usage.
Qualifier
Un qualifier est une annotation runtime qui discrimine plusieurs beans d’un même type. Le Default qualifier est implicite. CDI fournit @Default, @Any, @Named ; Vauban supporte tous les qualificateurs custom, y compris ceux à membres @Nonbinding.
Producer
Une méthode ou un champ @Produces produit un bean dont l’instanciation n’est pas contrôlée par le container, mais par le code utilisateur. Le disposer associé (@Disposes) est appelé à la destruction. Vauban génère une _ProducerFactory par méthode producer.
Observer
Un observer est une méthode @Observes ou @ObservesAsync qui réagit à un événement applicatif. Les observateurs asynchrones sont dispatchés sur les virtual threads. La résolution des observateurs est statique : le EventDispatcher consulte une table générée à la compilation.
Interceptor
Un interceptor enrobe l’appel d’une méthode (@AroundInvoke) ou d’un constructeur (@AroundConstruct). Les chaînes d’intercepteurs sont résolues à la compilation et stockées dans la _Factory du bean.
BeanManager
Le BeanManager est la façade SPI de CDI. Vauban l’expose via VaubanBeanManager, en lecture seule pour le code applicatif. Il permet :
-
la résolution programmatique de beans (
getBeans(Type, Qualifier…)) ; -
la résolution d’observateurs ;
-
l’accès aux contextes actifs.
Les méthodes mutables historiques (addBean, addObserverMethod) ne sont pas disponibles : tout est figé à la compilation.
Graphe d’injection
L’utilisateur ne touche jamais aux _Factory. Il appelle Vauban.bootstrap(), sélectionne un bean racine, et le container fait le reste.
Build Compatible Extensions
CDI 4.1 introduit les Build Compatible Extensions (BCE) : des hooks @Discovery, @Enhancement, @Registration, @Synthesis, @Validation exécutés à la compilation. Vauban les supporte nativement puisque tout son flux est compile-time. Voir vauban-test-suite pour des exemples de BCE personnalisées.
Différences avec CDI Full
Vauban implémente le profil Lite. Sont absents :
-
les portable extensions runtime (
Extension,BeforeBeanDiscovery, etc.) — remplacées par les BCE ; -
@Specializes; -
@ConversationScoped; -
la passivation (
PassivationCapable) ; -
l’EL (Expression Language) intégré aux beans gérés.
Voir la table comparative.