静态方法,或工具类如何调用Spring管理的对象,调用Dao,Service接口方法时,普通调用方式报空指针异常:解决方案。
由于是static方法去调用的是Spring管理的对象,而且static方法不能调用非静态的方法,和属性。
因为static方法不依赖对象的创建,在类加载的时候就被加载进内存,因此static调用dao接口或service接口里的方法时,接口的实现类也许并没有被Spring管理并实例化为对象。因此我们需要确保工具类被spring管理。并且在工具类中static方法调用普通方法之前,普通方法所在的类已经被Spring管理了并且实例化了。
代码:
/**
* @version : V1.0
* @ClassName: FileUtils
* @Description:
* @Auther: Anakki
* @Date: 2019/4/29 14:35
*/
@Component
public class FileUtils {
//用于对数据库操作的Dao接口,博主用的是
//Mybatis,由Mybatis调用接口返回数据库数据。
@Resource
private FileStructureDao fileStructureDao;
//静态化工具类变量
public static FileUtils fileUtils;
//注解用于告诉次代码在Spring加载之前就运行
@PostConstruct
public void init(){
fileUtils = this;//工具类的实例赋值给fileUtils
fileUtils.fileStructureDao=this.fileStructureDao;//会**Spring对Dao的管理并赋给此类
System.out.println("工具类已经初始化了,被纳入spring管理");
//我们在初始化之后调用一下静态方法
FileUtils.initFileStructure();
}
public static void initFileStructure(){
//查询所有文件并输出
List<FileInfo> fileInfos = fileUtils.fileStructureDao.retrieveFiles();
for (FileInfo fileInfo : fileInfos) {
System.out.println("===="+fileInfo);
}
}
}
运行结果:开始运行的时候报错。后来查看是我的实体类 FileInfo 没有空参构造,加上空参构造,就能运行了。
需要注意的是,调用static方法的时候,不能在springboot的启动类里调用,因为启动类执行的时候,工具类还未加载,更就不会有Spring去管理工具类的过程了。因此调用static方法时,需要保证在启动类执行之后。
需要有@Component注解告诉Spring对此对象的管理,及 @Resource 用来告诉Spring注入需要的对象。