Java使用@Autowired自动注入后Service为null问题记录

在Spring项目中遇到Impl实现Service时出现空指针异常,原因是Service为null。问题起因是由于项目启动时对某个类进行了new操作,导致Spring无法管理。解决方案是通过创建工具类手动注入Bean,使用GetBeanUtils.getBean()方法获取Service实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       最近在项目中遇到一个问题,在Impl中实现Service中的方法时,一直在报空指针异常,起初以为是数据处理的过程中存在问题,后来发现是目标service为null,导致在调试的过程中总是报空指针异常。

@Autowried
CsService csservice;    // 在调试整一直为null

        第一次遇到这种问题,在经过查询资料后,找到原因为项目中需要使用第三方包的监控功能,需要在项目启动时进行一次注册,在application中该impl被new修饰过,那么就不能被spring进行管理。

public static void main(String[] args) {
        try {
            SpringApplication.run(Application.class, args);
            new listerImpl().init();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

        解决办法也比较简单,既然自动注入不行,那就手动注入。

        1. 先创建一个工具类方法:

@Component
public class GetBeanUtils implements ApplicationContextAware {

    protected static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext app) throws BeansException {
        if (applicationContext == null) {
            applicationContext = app;
        }
    }


    /**
     * 通过类的class从容器中手动获取对象
     */
    public static <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }
}

        2. 然后在实现方法中传入class就可以了,这样就可以调用service中的方法了。

CSService csService = GetBeanUtils.getBean(CsService.class);

       参照:使用@Autowired注解获取对象为null的几种情况_autowired注入的对象为null_小孙的Blog的博客-优快云博客

### 解决@Autowired注解导致Spring服务注入问题 当遇到`@Autowired`注解无法成功注入Service对象,即注入的结果为`null`的情况,通常是因为以下几个原因造成的: #### 1. Bean未被扫描到 确保带有@Service或其他组件注解的类位于配置文件中定义的基础包及其子包下。只有这样,这些类才能被Spring上下文识别并注册成为Bean实例[^1]。 #### 2. 配置缺失@ComponentScan 如果自定义了基础包路径或者采用了模块化开发模式,则需确认已适当设置了`@ComponentScan`注解以覆盖所有需要扫描的包范围。 #### 3. 多个相同类型的Bean存在冲突 在同一作用域内如果有两个以上同类型的Bean,并且没有特别指明哪个应该优先考虑的话,可能会造成不确定的行为甚至失败。此可以通过添加`@Primary`或联合使用`@Qualifier`来解决问题[^3]。 #### 4. 循环依赖问题 循环依赖是指A依赖于B而B又反过来依赖于A的情形,在某些版本的Spring中这可能导致初始化阶段出现问题。对于这种情况,建议重构设计减少不必要的相互依赖关系;也可以尝试调整加载顺序或是采用setter方法代替构造器来进行依赖注入[^2]。 #### 5. 使用不当的作用域 检查所使用的Scope是否合适,默认情况下singleton是最常见的选择。但如果选择了prototype或者其他特殊scope,则需要注意其生命周期管理以及如何正确获取最新的bean实例。 ```java // 正确示例:确保Service类上有相应注解并且处于正确的包结构之下 package com.example.service; import org.springframework.stereotype.Service; @Service public class MyServiceImpl implements MyService { // ... } ``` ```java // Controller层中的正确写法 package com.example.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RestController; import com.example.service.MyService; @RestController public class MyController { private final MyService myService; @Autowired public MyController(MyService myService){ this.myService = myService; } // 或者使用字段注入(虽然推荐构造函数注入) //@Autowired //private MyService myService; //... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值