首先熟悉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。

 

 

 

 

 

 

 

 

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐