假设有这么一个静态方法
public Class DbUtil{
public static int getId(){
return 0;
}
}
我们通常使用IdUtil.getId();也就是类名.方法()调用类的静态方法。
但是!
使用这种方式spring容器其实是没有办法把对它的对象注入到这个类当中的。
那么怎么在静态调用的工具类中注入Spring管理的对象呢?
在下图的Dbutil中,我们注入了一个SqlSessionTemplate,而且是私有的。我们需要getId这个静态方法中使用,但是如果直接使用就会像这样
/**
* 单例数据库工具类
*/
@Log4j2
@Component
public class DbUtil {
private static DbUtil dbUtil = null;
private DbUtil() {
}
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
public static int getId(){
//这样是不行滴
sqlSessionTemplate.
return 0;
}
}
那如何在这个静态方法当中使用SqlSessionTemplate 呢?
在代码中,我们声明了一个静态类变量
private static DbUtil dbUtil = null;
我们只需想办法将注入进来的SqlSessionTemplate和Dbutil这个静态成员变量关联就可以解决这个问题。
我们需要用到spring当中一个注解@PostConstruct.它的作用是在这个类初始化完成之后,执行这个注解修饰的方法。
首先我们在这个初始化方法中把dbutil new出来
@PostConstruct
private void init(){
dbUtil=new DbUtil();
}
然后给这个注入的对象,也就是SqlSessionTemplate加上get和set方法
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
private SqlSessionTemplate getSqlSessionTemplate() {
return sqlSessionTemplate;
}
private void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSessionTemplate = sqlSessionTemplate;
}
最后我们setSqlSessionTemplate方法将 sqlSessionTemplate set到我们的成员变量当中
@PostConstruct
private void init(){
dbUtil=new DbUtil();
dbUtil.setSqlSessionTemplate(sqlSessionTemplate);
}
通过这种方式,我们就将两者进行的绑定!
接着就可以在getId()中使用了