解决springboot的静态工具类中使用mybatis的mapper对象为空

首先熟悉ssm开发的小伙伴都知道,mapper对象的注入一般在controller层。

@Controller
public class LoginController {

    @Autowired
    public LoginMapper loginMapper;

但是数据库的操作不一定只限于controller类中,如果我在普通java工具类中需要操作数据库,那我们直接注入会生效吗?

@Component
public class TokenUtil {

    @Autowired
    private  static LoginMapper loginMapper;

此时打印loginMapper对象为空,那么注入应该失败了。网上查阅资料得知,spring中,我们不能通过@Autowired注入一个静态变量,使之成为一个spring bean的。

原因是:当类加载器加载静态变量时,Spring上下文尚未加载。所以类加载器不会在bean中正确注入静态类,并且会失败。

那么解决的方法是?我们可以通过延迟加载的方式:

@Component
public class TokenUtil {

    @Autowired
    private  LoginMapper loginMapper;

    private static TokenUtil tokenUtil;

    @PostConstruct
    public void init() {
        tokenUtil = this;
        tokenUtil.loginMapper = this.loginMapper;
    }

    public static boolean queryToken(String token){
        int queryToken = tokenUtil.loginMapper.queryToken(token);
        if (queryToken > 0)
            return true;
        else
            return false;

    }
}

首先我们要明确下加载的顺序:Constructor >> @Autowired >> @PostConstruct

@PostConstruct注解的方法将会在依赖注入完成后被自动调用。此时便可将mapper对象正确注入给tokenUtil。

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值