You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring框架中手动实例化@Component注解类导致@Autowired依赖注入为空的问题咨询

问题原因与解决方案

这个问题的核心很清晰:你手动new出来的Test对象根本不在Spring容器的管理范围内,所以Spring不会帮你处理@Autowired的依赖注入

为什么会出现null?

虽然你的Test类标注了@Component,Spring确实会自动创建一个Test的Bean并完成依赖注入,但你在xyx()方法里用new Test()创建的是另一个完全独立的对象——Spring对这个对象一无所知,自然不会去注入它的i1属性,所以它的值是null

解决方案(根据你的需求选择)

因为你提到必须在xyx()方法中使用Test类,这里给你两种可行的方案:

方案1:直接使用Spring容器管理的Test实例(推荐)

既然Test已经是@Component标注的Bean,你可以直接把它作为参数注入到@Bean方法中,Spring会自动把容器里已经完成依赖注入的Test实例传进来:

@Bean
public void xyx(Test testInstance){
    // 这里的testInstance就是Spring管理的对象,i1已经被正确注入
    // 直接在这里写你的业务代码即可
}

这是最符合Spring设计理念的方式,不用手动处理注入,也能保证依赖都正确初始化。

方案2:手动注入依赖(仅当必须new Test时使用)

如果你因为某些业务原因必须手动new Test(),那可以通过Spring上下文手动获取interface1的实例,然后设置给Test对象:

@Autowired
private ApplicationContext applicationContext;

@Bean
public void xyx(){
    Test test = new Test();
    // 从Spring容器中获取interface1的实现类C1
    interface1 i1 = applicationContext.getBean(interface1.class);
    // 给Test对象设置i1,注意需要给Test类添加setter方法
    test.setI1(i1);
    
    // 接下来编写你的业务代码
}

⚠️ 注意:这种方式会破坏Spring的依赖注入机制,增加代码耦合度,除非真的有必要,否则优先用方案1。

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

火山引擎 最新活动