解决springboot的静态工具类中使用mybatis的mapper对象为空
首先熟悉ssm开发的小伙伴都知道,mapper对象的注入一般在controller层。@Controllerpublic class LoginController {@Autowiredpublic LoginMapper loginMapper;但是数据库的操作不一定只限于controller类中,如果我在普通java工具类中需要操作数据库,那我们直接注入会生效吗?@Componentpubl
·
首先熟悉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。
更多推荐
已为社区贡献1条内容
所有评论(0)