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 :

  1. La classe est annotée d’un scope (@ApplicationScoped, @Singleton, @Dependent, @RequestScoped) ou d’un stéréotype.

  2. La classe est visible depuis le module module-info.java (exports ou même module).

  3. 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émente BeanFactory<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.

Diagram

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

Diagram

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.