Spring环境下如何正确创建AnnotatedControllerConfigurer实例?
问题分析与解决方案
你的当前实现方式不符合Spring的设计预期,核心原因如下:
AnnotatedControllerConfigurer实现了ApplicationContextAware和InitializingBean接口,这两个都是Spring Bean生命周期的标准回调接口,说明它必须由Spring容器管理生命周期,但Spring默认不会自动注册这个类为Bean,所以你尝试自动注入时会提示找不到该类型的Bean。
手动实例化后调用setApplicationContext和afterPropertiesSet的方式,虽然能触发部分生命周期逻辑,但相当于绕开了Spring完整的Bean管理流程——如果AnnotatedControllerConfigurer内部依赖了其他Spring Bean,手动实例化的方式无法自动注入这些依赖,后续可能出现隐藏问题。
正确的实现方式
你需要手动将AnnotatedControllerConfigurer注册为Spring Bean,让容器完整管理它的生命周期:
- 在配置类中定义AnnotatedControllerConfigurer的Bean:
@Configuration public class GraphQlConfig { @Bean public AnnotatedControllerConfigurer annotatedControllerConfigurer() { return new AnnotatedControllerConfigurer(); } }
- 然后在创建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
相关产品推荐
相关产品推荐

