Quarkus Extension - Additional Bean Build Item

Après les ApplicationIndexBuildItem et CombinedIndexBuildItem continuons notre tour des builds items Quarkus avec l’AdditionalBeanBuildItem. Ce build item fait partie des items permettant le paramétrage de la bibliothèque Arc en charge de la gestion de l’injection de dépendance dans Quarkus.

Quarkus et l’injection de dépendances

Quarkus utilise massivement l’injection de dépendance. Cela permet d’avoir un couplage faible entre les différents objets d’une application Quarkus. Pour cela, Quarkus utilise une bibliothèque nommée Arc. Arc va automatiquement scanner le classpath de l’application et référencer pour injection l’ensemble des classes déclarées comme bean (celle annotée avec @Controller, @Service, …).

Dans le cadre d’une extension, il peut être intéressant de déclarer les objets fournis par l’extension comme bean pour les rendre injectables. Une extension peut aussi avoir besoin de déclarer comme bean injectable des objets, de l’application cible ou de ses dépendances, non annotées par une Annotation reconnue par Quarkus. C’est là qu’intervient l’AdditionalBeanBuildItem.

AdditionalBeanBuildItem

Ce build item s’utilise très simplement dans sa forme la plus simple en prenant en paramètre la classe à déclarer comme bean.

1
2
3
4
5
6
@BuildStep()
void addBeans(BuildProducer<AdditionalBeanBuildItem> producer) {
    producer.produce(new AdditionalBeanBuildItem("my.package.Foo"));
    // or
    producer.produce(new AdditionalBeanBuildItem(Foo.class));
}

On le combinera la plupart du temps avec un autre BuildItem (ex: CombinedIndexBuildItem) en entrée de manière à récupérer les classes à déclarer comme bean.

Par défauts, seuls les beans détectés comme utilisés lors du build par Quarkus seront conservés. Cela peut être paramétré comme ceci :

1
2
3
4
5
6
7
8
9
@BuildStep()
void addBeans(BuildProducer<AdditionalBeanBuildItem> producer) {
    producer.produce(AdditionalBeanBuildItem.unremovableOf("my.package.Foo"));
    // or

    producer.produce(AdditionalBeanBuildItem.Builder()
            .addBeanClasses(Foo.class)
            .setUnremovable());
}

Le scope du bean peut également être spécifié comme ceci dans le cas où la classe ne spécifierait pas de scope. D’après la documentation, cette méthode ne doit être utilisée que si aucune annotation ne peut être directement sur la classe cible.

1
2
3
4
5
6
7
@BuildStep()
void addBeans(BuildProducer<AdditionalBeanBuildItem> producer) {
    producer.produce(AdditionalBeanBuildItem.Builder()
            .addBeanClasses(Foo.class)
            .setUnremovable()
            .setDefaultScope(DotNames.APPLICATION_SCOPED));
}

Conclusion

L’AdditionalBeanBuildItem est un build item très utilisé par les extensions Quarkus pour rendre leur bean injectable dans les applications utilisant ces extensions. Le second cas d’usage est de rendre injectable des objets non déclarés comme bean dans des bibliothèques tierces.

0%