美文网首页
静态类和动态类的区别和使用

静态类和动态类的区别和使用

作者: 拄杖忙学轻声码 | 来源:发表于2021-10-15 14:22 被阅读0次

1、静态类中的静态方法可以通过类名直接调用静态方法,不需要实例化对象。但是无法和Spring容器中的bean进行交互,例如:

@Slf4j
public class ExcelUtil {
 
    public static <T> void writeEasyExcel(HttpServletResponse response, Class<T> tClass, List<T> datas, String fileName, List<Code> codeList) throws IOException, NoSuchFieldException, IllegalAccessException {
        TimeInterval timer = DateUtil.timer();
        if(ObjectUtil.isNull(response) || ObjectUtil.isNull(tClass)){
            return;
        }
 
        if(StrUtil.isBlank(fileName)){
            fileName = "excel.xlsx";
        }else{
            if(!fileName.contains(".xlsx")){
                fileName = fileName+".xlsx";
            }
        }
        response.setStatus(HttpServletResponse.SC_OK);
        response.setContentType("application/x-msdownload");
        response.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode(fileName, "utf-8"));
 
        //处理注解 start
        if (CollUtil.isNotEmpty(datas) && CollUtil.isNotEmpty(codeList)) {
            for (T dataObj : datas) {
                AnnotationUtil.resolveAnnotation(tClass, dataObj, codeList);
            }
        }
        //处理注解 start
 
        //registerWriteHandler 设置列宽自适应
        EasyExcel.write(response.getOutputStream(), tClass)
                .needHead(true)
                .excelType(ExcelTypeEnum.XLSX)
                .registerWriteHandler(new CustomCellWriteHandler())
                .sheet("sheet")
                .doWrite(datas);
        log.info("导出exlce数据:{}条,耗时:{}秒!", datas.size(), timer.intervalSecond());
    }
}

说明:
如果类中全是静态代码,可以使用 ExcelUtil.writeEasyExcel() 直接调用。如果类中需要和数据库交互或者需要和Spring容器交互,需要使用JavaBean动态组件类,如2说明

2、动态类是指一个类使用@Component注解标记为组件并加入到Spring容器中的类,此方式可以通过@Resource注入的方式调用方法,例如:

@Slf4j
@SuppressWarnings("all")
@Component
public class ExcelUtil {
    @Resource
    AnnotationUtil annotationUtil;
    
 
    public <T> void writeEasyExcel(HttpServletResponse response, Class<T> tClass, List<T> datas, String fileName) throws Exception {
        TimeInterval timer = DateUtil.timer();
        if(ObjectUtil.isNull(response) || ObjectUtil.isNull(tClass)){
            return;
        }
 
        if(StrUtil.isBlank(fileName)){
            fileName = "excel.xlsx";
        }else{
            if(!fileName.contains(".xlsx")){
                fileName = fileName+".xlsx";
            }
        }
        response.setStatus(HttpServletResponse.SC_OK);
        response.setContentType("application/x-msdownload");
        response.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode(fileName, "utf-8"));
 
        //处理注解 start
        if (CollUtil.isNotEmpty(datas)) {
            for (T dataObj : datas) {
                annotationUtil.resolveAnnotation(tClass, dataObj);
            }
        }
        //处理注解 start
 
        //registerWriteHandler 设置列宽自适应
        EasyExcel.write(response.getOutputStream(), tClass)
                .registerWriteHandler(new CustomCellWriteHandler())
                .excelType(ExcelTypeEnum.XLSX)
                .sheet("sheet")
                .doWrite(datas);
        log.info("导出exlce数据:{}条,耗时:{}秒!", datas.size(), timer.intervalSecond());
    }
}

说明:
1、因为此类中 writeEasyExcel() 方法中调用了 annotationUtil.resolveAnnotation() 方法,而 AnnotationUtil 类中的 resolveAnnotation() 方法需要和 redis 数据库交互,所以需要把 AnnotationUtil 类标记为组件对象加入容器,使用注入的方式调用 redisTemplate 对象

2、然后通过注入 ExcelUtil 的对象,调用 writeEasyExcel() 方法,如:

//注入
@Resource
ExcelUtil excelUtil;
 
//调用
excelUtil.writeEasyExcel()

3、总结:只要类中使用容器注入对象,那么这个类需要使用组件注解 @Component 把本类标记为组件类,加入到Spring容器中,才可以参与对象依赖注入。被调用的类规则也是如此

相关文章

  • 静态类和动态类的区别和使用

    1、静态类中的静态方法可以通过类名直接调用静态方法,不需要实例化对象。但是无法和Spring容器中的bean进行交...

  • 2016-6-20

    1.http 请求流程和格式2.chrome 分析3.显示静态和动态的区别4.使用类 浏览器的使用6.WSGI 作...

  • C++学习笔记三

    类和动态内存分配 1. 动态内存和类 静态成员 注意: 静态数据成员在类中声明,在类外初始化, 但如果静态成员是c...

  • iOS-类方法与实例方法

    搬运自 动态方法/实例方法 静态方法/类方法 静态方法和实例方法的区分 使用场景

  • Java动态代理 CGLib 与 JDK Proxy

    JDK动态代理 动态代理区别于静态代理,代理类在运行时生成。JDK 提供InvocationHandler接口和P...

  • C++基础学习

    1. 类的静态成员和非静态成员区别是: 类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过...

  • 面试积累java篇(二)

    1、静态变量和实例变量的区别?静态变量:static 修饰,类加载的时候为其分配空间,通过类名. 使用实例变量:...

  • python学习日记-2016.7.22

    1.使用type()动态创建类 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态...

  • C#笔记二

    一. 静态方法,静态类 (static) 静态和非静态区别 在非静态类(public class)中,既可以有实例...

  • 打开类与细化

    细化使用方法: 区别: 打开类:可以重新打开已经存在的类,并对之进行动态修改 细化:打开类和细化的作用相似,区别在...

网友评论

      本文标题:静态类和动态类的区别和使用

      本文链接:https://www.haomeiwen.com/subject/hermoltx.html