Spring通过@Component配置Bean后,Bean中的@PostConstruct 方法不起作用

代码是这样的

package com.cwf.wms.utility;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.cwf.wms.product.entity.Product;
import lombok.extern.log4j.Log4j;
import lombok.extern.log4j.Log4j2;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import sun.misc.Unsafe;

import javax.annotation.PostConstruct;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

@Component
@Profile("dev")
@Log4j2
public class LoadExcelToDataBase {
    @PostConstruct
    public <T> void read() {
        disableWarning();
        String file = "C:\\Users\\Administrator\\Desktop\\workdoc\\h2\\H2_PUBLIC_PRODUCT.xlsx";
        EasyExcel.read(file, Product.class, new AnalysisEventListener() {
            @Override
            public void invoke(Object o, AnalysisContext analysisContext) {
                log.trace("read from sheet {}, row {}:{}", analysisContext.readSheetHolder().getSheetName(), analysisContext.readRowHolder().getRowIndex(), o);
                System.out.println("数据加载成功!!!!");
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                System.out.println("数据加载成功22222!!!!");
            }
        }).sheet("0").registerConverter(new ExcelToDataConvert()).doRead();

    }


    public static void disableWarning() {
        try {
            Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
            theUnsafe.setAccessible(true);
            Unsafe u = (Unsafe) theUnsafe.get(null);

            Class cls = Class.forName("jdk.internal.module.IllegalAccessLogger");
            Field logger = cls.getDeclaredField("logger");
            u.putObjectVolatile(cls, u.staticFieldOffset(logger), null);
        } catch (Exception e) {
            // ignore
        }
    }

}

你看看控制台提示。我没记错的话, @PostConstruct 方法是不能有返回值,参数的。

你这提问就有问题。PostConstruct 是执行的,至于里面的read逻辑为啥没执行。这看不出来。

我只能这么给你分析,看你这个方法调用,有个监听回调。这极有可能是一个异步操作。异步操作的话,你要看看执行是否异常,监听器应该有监听异常的方法。控制台全局看看,因为是异步,这个日志可能在其他地方输出了。

嗯,方法的问题,没有进去