You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring环境下如何正确创建AnnotatedControllerConfigurer实例?

问题分析与解决方案

你的当前实现方式不符合Spring的设计预期,核心原因如下:

AnnotatedControllerConfigurer实现了ApplicationContextAware和InitializingBean接口,这两个都是Spring Bean生命周期的标准回调接口,说明它必须由Spring容器管理生命周期,但Spring默认不会自动注册这个类为Bean,所以你尝试自动注入时会提示找不到该类型的Bean。

手动实例化后调用setApplicationContext和afterPropertiesSet的方式,虽然能触发部分生命周期逻辑,但相当于绕开了Spring完整的Bean管理流程——如果AnnotatedControllerConfigurer内部依赖了其他Spring Bean,手动实例化的方式无法自动注入这些依赖,后续可能出现隐藏问题。

正确的实现方式

你需要手动将AnnotatedControllerConfigurer注册为Spring Bean,让容器完整管理它的生命周期:

  1. 在配置类中定义AnnotatedControllerConfigurer的Bean:
@Configuration
public class GraphQlConfig {

    @Bean
    public AnnotatedControllerConfigurer annotatedControllerConfigurer() {
        return new AnnotatedControllerConfigurer();
    }
}
  1. 然后在创建ExecutionGraphQlService时,直接注入这个Bean并使用:
@Bean
public ExecutionGraphQlService defaultExecutionGraphQlService(AnnotatedControllerConfigurer configurer,
                                                             RuntimeWiring.Builder runtimeWiringBuilder) {
    // 由Spring管理的configurer已经完成了ApplicationContext注入和afterPropertiesSet回调
    configurer.configure(runtimeWiringBuilder);
    
    // 根据业务逻辑构建并返回ExecutionGraphQlService实例
    return new DefaultExecutionGraphQlService(...);
}

这样做的优势:

  • Spring会自动处理ApplicationContextAware的setApplicationContext调用,无需手动设置
  • InitializingBean的afterPropertiesSet方法会在Bean初始化完成后自动执行
  • 如果AnnotatedControllerConfigurer内部有其他依赖,Spring会自动完成注入

关于之前尝试的方式

构造函数注入失败是因为Spring上下文没有该类型的Bean;手动调用autowireCapableBeanFactory.autowireBean()虽然能注入部分依赖,但依然不如直接注册为Bean可靠,因为Spring的Bean生命周期还包括BeanPostProcessor等扩展点的处理,手动方式无法覆盖这些环节。

内容的提问来源于stack exchange,提问作者Henry Filosa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:30:38