Spring迁移Quarkus时无@Component注解的依赖Jar注入问题咨询
前置说明
你之前的方案失效原因是:手动new出来的实例不属于Quarkus Arc容器的管理范围,容器不会自动处理实例内部的@Autowired依赖注入,所以二级依赖会触发空指针。
问题1:无需重新编译依赖Jar的适配方案
有两种可直接落地的方案,都不需要修改原有第三方Jar的代码:
方案1:修改现有生产者,手动触发容器注入
在生产者方法中,实例化对象后通过BeanManager主动触发依赖注入,修改后的生产者代码如下:
import javax.enterprise.inject.spi.BeanManager; import javax.enterprise.context.Dependent; import javax.enterprise.inject.Produces; @Dependent public class ProducerClass { @Inject BeanManager beanManager; @Produces public OtherLevelOne createOtherLevelOne() { OtherLevelOne instance = new OtherLevelOne(); // 通知容器完成该实例的所有依赖注入 beanManager.createInjectionTarget(beanManager.createAnnotatedType(OtherLevelOne.class)) .inject(instance, beanManager.createCreationalContext(null)); return instance; } @Produces public OtherLevelTwo createOtherLevelTwo(){ return new OtherLevelTwo(); } }
该方案适合需要注册的第三方类数量不多的场景。
方案2:配置包扫描自动识别Bean
如果需要适配的类数量很多,写生产者太繁琐,可以直接通过配置让Quarkus自动把第三方包下的类纳入Bean管理:
- 首先确保你的项目已经引入了
quarkus-spring-di扩展,用于兼容Spring的@Autowired注解 - 在
application.properties中添加配置,指定需要扫描的第三方Jar的包路径:
# 多个包用英文逗号分隔 quarkus.arc.include-packages=com.xxx.legacy.package1,com.xxx.legacy.package2
配置完成后Quarkus会自动扫描这些包下的类,识别带有@Autowired等注入注解的类并注册为Bean,自动完成所有层级的依赖注入,不需要额外写任何生产者代码。
问题2:通过Quarkus扩展实现依赖注入的可行性
完全可以,这种方案适合有大量legacy Jar需要统一适配的场景,一劳永逸。
你可以自定义Quarkus扩展,在扩展的构建步骤中实现以下逻辑:
- 用
AdditionalBeanBuildItem将所有需要纳入管理的第三方类批量注册为Bean - 用
AnnotationTransformerBuildItem动态给这些类添加CDI作用域注解(比如@Dependent),不需要修改原有类的代码 - 也可以在扩展中统一处理Spring注解的兼容逻辑,适配更多特殊场景
扩展编写完成后,只需要在你的应用中引入该扩展即可完成所有legacy类的适配,不需要每个应用单独做配置或者写生产者。
内容的提问来源于stack exchange,提问作者Digsb
相关产品推荐
相关产品推荐

