Micronaut中注入命名字符串列表单例Bean为何为空?是否可行?
能否直接注入命名的列表类型Bean?
可以直接注入命名的列表类型Bean,Micronaut支持这种注入方式,只要配置正确就能正常工作。
你的写法可能存在的问题
Factory类未被正确扫描
确认你的@Factory类所在的包是否在Micronaut的扫描范围内。如果Micronaut没有扫描到该Factory类,provideDependencyPackages方法就不会被执行,此时注入的可能是框架自动创建的空列表——因为当注入List<String>时,若找不到匹配的命名Bean,Micronaut可能返回空集合而非抛出异常。Config实例未正确加载
你的代码逻辑是先添加固定的DEPENDENCY_PACKAGES元素,再追加配置项。如果最终得到空列表,大概率是provideDependencyPackages方法根本没被调用。检查Config类是否正确绑定了配置、是否能被Micronaut正常注入,若Config加载失败,方法执行逻辑会直接中断,导致没有Bean实例生成。存在同名的List
Bean
排查项目中是否有其他被@Named("dependencyPackagesBean")标注的List<String>类型Bean。如果存在多个同名同类型Bean,Micronaut可能注入了另一个空的实例。泛型匹配的隐性问题
虽然@Named能规避大部分泛型擦除问题,但仍需确认JobManager构造函数中的List<String>与Factory返回的列表类型是否完全匹配,避免因隐性类型不匹配导致注入错误实例。
为什么包装类注入可行?
当用自定义包装类包裹列表时,该包装类是唯一的自定义类型,Micronaut注入时会精准匹配对应的Bean,不会和框架默认的集合自动收集逻辑(比如收集所有String类型Bean到List中)产生混淆,也不会出现找不到对应Bean时返回空集合的情况,因此能稳定注入正确的实例。
内容的提问来源于stack exchange,提问作者Semper_fi

