Micronaut中如何记录触发单例Bean初始化的注入类
在Micronaut中找出注入单例Bean的依赖Bean
你可以通过Micronaut的BeanContext和Bean定义API实现这个调试需求,具体如下:
实现方案
- 在单例类A中注入
BeanContext——它是Micronaut管理所有Bean的核心上下文。 - 在
@PostConstruct方法内,通过BeanContext获取类A对应的BeanDefinition元数据。 - 查询所有直接依赖类A的Bean定义,打印这些Bean的类名称,也就是触发A初始化的B类。
代码示例
import io.micronaut.context.BeanContext; import io.micronaut.context.annotation.PostConstruct; import io.micronaut.context.annotation.Singleton; import jakarta.inject.Inject; @Singleton public class BeanA { private final BeanContext beanContext; @Inject public BeanA(BeanContext beanContext) { this.beanContext = beanContext; } @PostConstruct public void logDependentBeans() { // 获取BeanA对应的Bean定义 beanContext.findBeanDefinition(BeanA.class).ifPresent(beanDefinition -> { // 遍历所有依赖BeanA的Bean定义 beanContext.getBeanDefinitionRegistry() .getDependentBeanDefinitions(beanDefinition) .forEach(dependentBean -> { System.out.println("触发BeanA初始化的Bean: " + dependentBean.getBeanType().getName()); }); }); } }
原理说明
BeanContext提供了访问Bean元数据的入口,findBeanDefinition能精准获取当前类的Bean配置信息。getDependentBeanDefinitions方法会返回所有直接依赖当前Bean的Bean定义,也就是那些在自身中注入了BeanA的类(即你要找的B类)。- 在
@PostConstruct中执行该逻辑,会在BeanA初始化完成后立即输出所有触发它初始化的依赖Bean名称。
扩展(可选)
如果需要查看更详细的注入细节(比如是通过构造器、字段还是方法注入),可以遍历依赖Bean的注入点:
dependentBean.getInjectionPoints().forEach(injectionPoint -> { if (injectionPoint.getType().isAssignableFrom(BeanA.class)) { String injectType = injectionPoint.getKind().name(); System.out.println("Bean " + dependentBean.getBeanType().getName() + " 通过 " + injectType + " 注入BeanA"); } });
内容的提问来源于stack exchange,提问作者Zonko
相关产品推荐
相关产品推荐

