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

Spring无XML配置未扫描包,组件注入失败求助

问题分析与解决方案:无XML Spring环境中组件注入失效

嗨,我一眼就看出问题出在哪了——你的代码里根本没启动Spring的IoC容器!你虽然正确添加了@Configuration、@ComponentScan注解,也给Foo和FooController标记了@Service、@Controller,但WebServer的main方法是空的,Spring完全没机会去扫描包、创建Bean实例,更别说执行依赖注入了。

核心修改:启动Spring容器

你需要在main方法中初始化Spring的注解配置容器AnnotationConfigApplicationContext,让Spring开始工作。修改后的WebServer代码如下:

@Configuration 
@ComponentScan("com.mypackage") 
public class WebServer { 
    public static void main(String[] args) throws Exception { 
        // 初始化Spring注解容器,传入你的配置类
        ApplicationContext context = new AnnotationConfigApplicationContext(WebServer.class);
        
        // 测试:从容器中获取FooController,验证注入是否成功
        FooController controller = context.getBean(FooController.class);
        // 调用Foo的方法,确认注入生效
        controller.getFoo().print();
    } 
} 

辅助修改:添加测试方法(可选)

为了方便验证注入效果,可以给FooController加一个获取Foo的方法:

@Controller 
public class FooController { 
    private Foo foo; 

    @Autowired 
    public void setFoo(Foo foo) { 
        this.foo = foo;
        System.out.println("setFoo方法已被调用!"); // 打印日志验证注入动作
    }

    // 新增方法用于测试
    public Foo getFoo() {
        return foo;
    }
}

为什么这样能解决问题?

  • AnnotationConfigApplicationContext是Spring专门用于基于注解配置的容器实现,当你传入配置类WebServer后,它会自动识别@ComponentScan注解,扫描指定的com.mypackage包下所有标注了@Service、@Controller、@Component等的类,创建对应的Bean实例。
  • 当容器创建FooController实例时,会发现@Autowired标注的setFoo方法,自动从容器中取出Foo的实例注入进去,此时setFoo方法就会被调用。

关于依赖的说明

你的pom.xml中引入的spring-core和spring-context依赖是完全足够的,只要版本统一(确保${org-springframework.version}已经正确定义),就不会有依赖缺失的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:33:43