Quarkus CDI:如何仅在ServiceFoo禁用时执行ServiceBar启动逻辑?
解决方法
你可以通过Quarkus提供的@UnlessProperty条件注解实现需求,它和@LookupIfProperty是反向逻辑,能精准控制Bean或方法的生效时机。
有两种实现方式,可根据你的场景选择:
方式一:仅控制启动方法的执行
如果希望ServiceBar Bean始终存在,但只在ServiceFoo禁用时执行启动逻辑,直接给onStart()方法添加@UnlessProperty注解:
@ApplicationScoped class ServiceBar implements Service { @Startup // 仅当service.foo.enabled不等于true时,该方法才会执行 @UnlessProperty(name = "service.foo.enabled", stringValue = "true") public void onStart() { // 此处编写启动逻辑 } public String name() { return "bar"; } }
方式二:控制整个ServiceBar Bean的实例化
如果希望只有在ServiceFoo禁用时,ServiceBar才被实例化(启动逻辑自然也只会此时执行),直接给ServiceBar类添加@UnlessProperty注解:
@ApplicationScoped // 仅当service.foo.enabled不等于true时,该Bean才会被创建 @UnlessProperty(name = "service.foo.enabled", stringValue = "true") class ServiceBar implements Service { @Startup public void onStart() { // 此处编写启动逻辑 } public String name() { return "bar"; } }
补充说明
如果service.foo.enabled属性可能未配置,可通过defaultValue参数设置默认行为,比如:
@UnlessProperty(name = "service.foo.enabled", stringValue = "true", defaultValue = "false")
这样当属性未配置时,会默认按false处理,即ServiceBar的启动逻辑会执行。
内容的提问来源于stack exchange,提问作者Fabrizio Fortino
相关产品推荐
相关产品推荐

