springboot 使用反射时spring注入无效

本文介绍了如何在Spring应用中,通过反射获取指定类的Bean实例,并利用@Autowired注解的ApplicationContext,实现对方法的动态调用。重点展示了Class.forName()、getBean()和Method.invoke()方法的使用步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决方法:

     在使用反射的类中注入  ApplicationContext,

     通过applicationContext.getBea(cls);  从spring中获取bean

    @Autowired

     private ApplicationContext applicationContext;

 

    Class<?> cls = Class.forName("xxx.xxx.xxx.xxx.classname");

    Object bean = applicationContext.getBean(cls);

    Method method = cls.getMethod(methodName, class<?>parameterTypes);

    Object invoke = method.invoke(bean, parameter);
————————————————
版权声明:本文为优快云博主「w宁静致远」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/wsh_ningjing/article/details/90632952

package com.example.problembase.service; import com.example.entry.demo.MutexUserPostRequest; import com.example.entry.demo.MutexUserPostResponse; import java.util.List; public interface EulPermMutexQueryService { List<MutexUserPostResponse> selectMutexUserPostPage(MutexUserPostRequest request); } package com.example.problembase.service; import com.example.entry.demo.UserPostRequest; import com.example.entry.demo.UserPostResponse; import java.util.List; public interface EulPermQueryService { List<UserPostResponse> selectUserPostPage(UserPostRequest request); } package com.example.problembase.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.example.entry.dto.problemitem.ProblemitemDTO; import com.example.entry.dto.problemitem.ProblemitemQueryDTO; import com.example.entry.dto.problemitem.ProblemitemUpdateDTO; import com.example.entry.po.problemitem.Problemitem; import com.example.entry.vo.problemitem.ProblemitemVO; import java.util.List; /** * <p> * 技术问题记录明细 服务类 * </p> * * @author Luo * @since 2025-06-21 */ public interface IProblemitemService extends IService<Problemitem> { /** * 获取实体list * * @return */ List<ProblemitemVO> listNoPage(ProblemitemQueryDTO param); /** * 获取实体list分页 * * @param param * @return */ IPage<ProblemitemVO> list(ProblemitemQueryDTO param); /** * 获取实体详情 * * @param id * @return */ ProblemitemVO get(String id); /** * 保存实体 * * @param param * @return */ boolean save(ProblemitemDTO param); /** * 更新实体 * * @param param * @return */ boolean update(ProblemitemUpdateDTO param); /** * 根据ID删除 * * @param id * @return */ boolean deleteByID(String id); } package com.example.entry.demo; import lombok.Data; @Data public class EviReportFilecreateinfoEntity { private String fileName; private String status; private String createMessage; private String recordNum; private String fileSize; } package com.example.entry.demo; import lombok.Data; @Data public class ReportDownExcelRequest { private String fileName; private String excelType; } package com.example.exception; import com.example.enums.CommonResponseEnum; public class CommonBusinessException extends RuntimeException{ private Integer code; private String message; public CommonBusinessException(Integer code, String message) { this.code = code; this.message = message; } public CommonBusinessException(CommonResponseEnum responseEnum) { this.code = responseEnum.getCode(); this.message = responseEnum.getMessage(); } public CommonBusinessException(CommonResponseEnum responseEnum, String message) { this.code = responseEnum.getCode(); this.message = message; } } package com.example.enums; import com.example.assertion.Assert; import com.example.exception.CommonBusinessException; import lombok.Getter; import java.text.MessageFormat; @Getter public enum CommonResponseEnum implements Assert { /** * 密码错误 */ SYSTEM_ERROR(601, "密码错误"), /** * 数据异常 */ DATA_EXCEPTION(602,"数据异常"), private final Integer code; private final String message; CommonResponseEnum(Integer code, String message) { this.code = code; this.message = message; } /** * 创建异常 * * @param args * @return */ @Override public CommonBusinessException newException(Object... args) { String msg = MessageFormat.format(this.getMessage(), args); return new CommonBusinessException(this.getCode(),msg); } @Override public CommonBusinessException newException(Throwable t, Object... args) { return null; } } package com.example.entry.demo; import lombok.Data; @Data public class PaiCommSysparam { private String paraValue; } package com.example.utils; import com.example.entry.demo.PaiCommSysparam; public class ParaCommmonUtil { public static PaiCommSysparam getParameter(String moduleName,String key){ return new PaiCommSysparam(); } } 上面的是相关的引用和依赖 测试框架是MockitoJUnitRunner, 单元测试类如下: @RunWith(MockitoJUnitRunner.class) public class ExcelServiceImplTest { } 请帮我为下面的代码生成单元测试,单元测试代码写在ExcelServiceImplTest中 package com.example.problembase.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.excel.EasyExcelFactory; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.example.entry.demo.*; import com.example.entry.po.problemitem.Problemitem; import com.example.enums.CommonResponseEnum; import com.example.exception.CommonBusinessException; import com.example.problembase.service.EulPermMutexQueryService; import com.example.problembase.service.EulPermQueryService; import com.example.problembase.service.IProblemitemService; import com.example.problembase.service.ITecHigLigService; import com.example.utils.ParaCommmonUtil; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.stereotype.Component; import java.io.File; import java.io.IOException; import java.math.BigDecimal; import java.nio.file.Files; import java.nio.file.Path; import java.util.HashMap; import java.util.List; @Component @EnableAsync public class ExcelServiceImpl { @Autowired private ITecHigLigService iTecHigLigService; @Autowired private EulPermMutexQueryService eulPermMutexQueryService; @Autowired private EulPermQueryService eulPermQueryService; @Autowired private IProblemitemService iProblemitemService; private static HashMap<String, Class> reportMap = new HashMap<>(); static { reportMap.put("1", Demo2DO.class); } @Async public void typeExcelDown(EviReportFilecreateinfoEntity insertFileEntry, ReportDownExcelRequest request) { if (ObjectUtil.isEmpty(insertFileEntry.getFileName())) { throw new CommonBusinessException(CommonResponseEnum.SYSTEM_ERROR); } // String filePath = "/" + "20240231" + File.separator + "report" + insertFileEntry.getFileName() + ".xlsx"; File file = new File(filePath); Path parentPath = file.toPath().getParent(); //检查父目录是否存在,如果不存在,则尝试创建 if (parentPath != null && Files.notExists(parentPath)) { try { Files.createDirectories(parentPath); } catch (IOException e) { throw new CommonBusinessException(CommonResponseEnum.SYSTEM_ERROR); } } boolean flag = true; if (!file.exists()) { try { file.createNewFile(); } catch (IOException e) { insertFileEntry.setStatus("4"); insertFileEntry.setCreateMessage(e.getMessage()); flag = false; } } if (flag) { excelDown(request, insertFileEntry, filePath, reportMap.get(request.getExcelType())); } Problemitem insertFileEntryp = new Problemitem(); LambdaQueryWrapper<Problemitem> querywrapper = new LambdaQueryWrapper<>(); querywrapper.eq(Problemitem::getRecordNum, insertFileEntry.getRecordNum()); iProblemitemService.update(insertFileEntryp, querywrapper); } public void excelDown(ReportDownExcelRequest request, EviReportFilecreateinfoEntity insertFileEntry, String filePath, Class tClass) { long current = 1; boolean hasMoreData = true; try { ExcelWriter excelwriter = EasyExcelFactory.write(filePath, tClass).build(); WriteSheet writeSheet = EasyExcelFactory.writerSheet(insertFileEntry.getFileName()).build(); PaiCommSysparam parameter = ParaCommmonUtil.getParameter("EUMS", "EXCEL_PAGE_MAX"); Long maxSize = Long.valueOf(parameter.getParaValue()); while (hasMoreData) { List records = getList(request, current, maxSize); if (current == 1 && CollUtil.isEmpty(records)) { insertFileEntry.setStatus("2"); insertFileEntry.setCreateMessage("没有"); hasMoreData = false; } else if (current != 1 && CollUtil.isEmpty(records)) { insertFileEntry.setStatus("1"); hasMoreData = false; } else { // excelwriter.write(records, writeSheet); hasMoreData = checkMoreData(records.size(), maxSize); current++; } excelwriter.finish(); insertFileEntry.setStatus("1"); insertFileEntry.setFileSize(getFilesizeKB(new File(filePath))); } }catch(Exception e){ insertFileEntry.setStatus("4"); insertFileEntry.setCreateMessage(e.getMessage()); } } public List getList(ReportDownExcelRequest request, long current, long maxSize) { switch (request.getExcelType()){ case "1": MutexUserPostRequest req = new MutexUserPostRequest(); BeanUtils.copyProperties(request,req); req.setQuerySize(maxSize); req.setStertNum(current); return eulPermMutexQueryService.selectMutexUserPostPage(req); case "2": UserPostRequest req1 = new UserPostRequest(); BeanUtils.copyProperties(request,req1); req1.setQuerySize(maxSize); req1.setStertNum(current); return eulPermQueryService.selectUserPostPage(req1); default: throw new CommonBusinessException(CommonResponseEnum.SYSTEM_ERROR); } } public boolean checkMoreData(int size, long maxSize) { if (size == maxSize) { return true; } else { return false; } } public static String getFilesizeKB(File file) { if (file.exists()) { long fileSizeInBytes = file.length(); double fileBK = fileSizeInBytes / 1024.0; BigDecimal db = new BigDecimal(fileBK).setScale(2, BigDecimal.ROUND_HALF_UP); return db.toString(); } else { return "-1"; } } }
最新发布
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值