Weld SE环境中引导时@Parameters的加载来源及相关问题
关于Weld SE中@Parameters的来源及相关问题解答
一、@Parameters的注入来源
@Parameters是Weld SE专门提供的限定符,用于注入应用启动时的命令行参数,它的加载逻辑和你使用的入口方式直接相关:
- 当你使用
org.jboss.weld.environment.se.StartMain作为程序入口时,这个类会自动捕获启动时的命令行参数,存储到静态变量StartMain#PARAMETERS中。同时,Weld的SE环境扩展会自动将这个参数列表作为一个Bean注册到CDI容器里,所以你能在@Observes ContainerInitialized的方法中直接通过@Parameters List<String>注入参数。 - 而当你自己编写main方法、手动通过
new Weld().initialize()启动容器时,Weld默认不会自动处理命令行参数的注册——因为它不知道你要传递的args是什么,也不会主动捕获。这就是为什么这种方式下无法直接注入@Parameters的原因。
二、手动初始化时如何启用@Parameters注入
如果你想在自定义main方法中也能使用@Parameters注入,需要手动将命令行参数注册为CDI Bean:
import org.jboss.weld.environment.se.Weld; import org.jboss.weld.environment.se.WeldContainer; import org.jboss.weld.environment.se.annotations.Parameters; import java.util.Arrays; import java.util.List; public class CustomMain { public static void main(String[] args) { Weld weld = new Weld(); // 手动注册带有@Parameters限定符的命令行参数Bean weld.addBean() .types(List.class) .qualifier(new ParametersLiteral()) .producer(() -> Arrays.asList(args)); WeldContainer container = weld.initialize(); // 之后就可以正常使用@Parameters注入了 container.select(MyApplicationBean.class).get().callBusinessMethod(); container.shutdown(); } // 实现@Parameters的限定符字面量类 private static class ParametersLiteral extends jakarta.enterprise.util.AnnotationLiteral<Parameters> implements Parameters {} }
注册完成后,你的Bean就能像第一个示例那样注入@Parameters List<String>了。
三、关闭钩子日志的处理方案
你提到的Weld SE container STATIC_INSTANCE shut down by shutdown hook日志,不需要禁用关闭钩子就能解决——通过调整日志级别即可:
- 如果使用JDK默认的日志系统,可以在项目的
logging.properties中添加配置:
把该日志的级别设为org.jboss.weld.environment.se.shutdown.hook.level = FINEFINE(对应DEBUG级别),这样默认的INFO级别输出就不会包含这条日志了。 - 如果使用SLF4J、Logback等第三方日志框架,只需在对应的配置文件中把
org.jboss.weld.environment.se.shutdown.hook的日志级别调整为DEBUG或更低即可。
内容的提问来源于stack exchange,提问作者Martin Mucha
相关产品推荐
相关产品推荐

