静态方法,或工具类如何调用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 没有空参构造,加上空参构造,就能运行了。

静态方法,或工具类如何调用Spring管理的对象,调用Dao,Service接口方法时,普通调用方式报空指针异常:解决方案。

需要注意的是,调用static方法的时候,不能在springboot的启动类里调用,因为启动类执行的时候,工具类还未加载,更就不会有Spring去管理工具类的过程了。因此调用static方法时,需要保证在启动类执行之后。

需要有@Component注解告诉Spring对此对象的管理,及 @Resource 用来告诉Spring注入需要的对象。