SpringBoot 中@Autowired 注入失效原因及解决方法

问题背景:

用户登录模块实现邮箱验证码登录


问题描述

邮件工具类通过@@Autowired注入userMapper调用checkEmailExist(email)接口报java.lang.NullPointerException: null错误


原因分析:

代码中使用new关键字创建实例,导致userMapper注入失效报java.lang.NullPointerException: null错误,代码如下


//邮件工具类
public class SmsHelper {
    @Autowired
    private MailUtil mailUtil;
    @Autowired
    private UserMapper userMapper;

    public  Res<Boolean> sendValiCode(String info, String code){

        Res<Boolean> res = new Res<>();
        if (!ParamsCheck.checkEmail(info)){
            res.setData(true);
            System.out.println("发送验证码:"+code);
            res.setMsg("成功");
        }
        else {
            int count = userMapper.checkEmailExist(info);
            if (count<1) {
                res.setCode(EnumUdsError.EMAIL_TEL_NOT_EXIST.getCode());
                res.setMsg(EnumUdsError.EMAIL_TEL_NOT_EXIST.getMsg());
                return res;
            }
       }
       //发送邮件代码
   }
   
@Service("accountMidService")
public class AccountServiceImpl implements AccountMidService {  
	
	@Override
    public Res<Boolean> sendSmsValiCode(String info){
    	Res<Boolean> res = new Res<>();
        String code = null;
    	//生成验证码
    	......
    	res = new SmsHelper().sendValiCode(info, code);   //通过new实例来进行方法调用,导致该类下的通过@Autowired自动注入的userMapper,注入失效
    	return res;
    }
}

解决方案:

将邮件工具类交给spring容器管理,以注解的方式将对象注入,并调用发送验证码方法

@Service("smsHelper")
public class SmsHelper {}
@Service("accountMidService")
public class AccountServiceImpl implements AccountMidService {  
	@Autowired
    private SmsHelper smsHelper;
    @Override
    public Res<Boolean> sendSmsValiCode(String info){
    	Res<Boolean> res = new Res<>();
        String code = null;
    	//生成验证码
    	......
    	res = smsHelper.sendValiCode(info, code);   //以注入对象的方式进行调用,而不是使用new实例的方式
    	return res;
    }
}

@Autowired 注入失效方式原因总结:

1. 被@Autowired 注解的类所在的包没有被扫描到,springBoot默认Bean装配是在springboot启动类所在包位置从上往下扫描,如果想要注入的类,不属于当前@SpringBootApplication 标注类的子包下,就需要用scanBasePackages 属性手动设置需要扫描包的位置,例如@SpringBootApplication(scanBasePackages = {“com.saas.user.service”,“com.saas.user.mid”})

2. 代码中A类包含以@@Autowired方式注入的属性B,如果A类通过new实例对象则属性B会注入失败

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@Autowired注解失效的几个原因主要包括以下几种情况: 1. @Autowired注解的类所在的包路径没有被扫描到。Spring Boot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描。如果需要自动装载的类所在包不在扫描范围内,则不会被扫描到,自然就无法被注入。 2. 在静态变量上使用@Autowired注解。由于静态变量是在程序启动时就已经创建的,所以无法使用注解进行注入。虽然在注入时不会报错,但在运行时使用注入的对象时会导致空指针异常。 3. 在使用new关键字创建类的实例时,自动注入失效。如果一个类A包含成员属性B,并且B通过@Autowired注解自动注入,但如果类A的实例是通过new的方式创建的,那么自动注入将无效。 综上所述,@Autowired注解失效的可能原因包括包路径未被扫描到、在静态变量上使用注解和通过new关键字创建实例等情况。在使用@Autowired注解时,需要注意这些情况以确保注入的有效性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [@Autowired注解以及失效几个原因](https://blog.csdn.net/wuhui2100/article/details/125448645)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [SpringBoot @Autowired 注入失效原因解决方法](https://blog.csdn.net/qq_43842093/article/details/118927697)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值