1.场景还原
在开发的过程中,有很多想在静态方法中调用mapper的同学,但是实例化的mapper又不能在静态方法中引用,至此可能会放弃这个想法,今天笔者带着大家如何在静态方法中调用mapper;
2.实现方案
①全局上下文工具类配置
@Slf4j public class ApplicationContextUtil { private static ApplicationContext applicationContext; public static void setApplicationContext(ApplicationContext ac) throws BeansException { applicationContext = ac; } public static ApplicationContext getApplicationContext() { return applicationContext; } /** * 根据Class类型在IOC容器中获取对象 * @param clazz Class类型 * @return 对象 */ public static <T> List<T> getBeanByType(Class<T> clazz) { List<T> list = new ArrayList<T>(); /* 获取接口的所有实例名 */ String[] beanNames = applicationContext.getBeanNamesForType(clazz); log.debug("getBeanByType beanNames : " + beanNames == null ? "" : Arrays.toString(beanNames)); if (beanNames == null || beanNames.length == 0) { return list; } T t = null; for (String beanName : beanNames) { t = (T)applicationContext.getBean(beanName); list.add(t); } return list; } }
②在工程启动类中加入全局上下文
@SpringBootApplication @ComponentScan("com.yivi") @MapperScan("com.yivi.yivisender.dispatchfsm.dao") @EnableTransactionManagement @EnableCaching public class DispatchfsmApplication { public static void main(String[] args) { ApplicationContext app = SpringApplication.run(DispatchfsmApplication.class, args); ApplicationContextUtil.setApplicationContext(app); } }
③笔者以系统日志工具类为例
/** * 插入系统日志 */ public static void insertStatusLog(String dispatchId ,Integer from, Integer to, Integer event){ YiViDispatchOrderStatusLog log = new YiViDispatchOrderStatusLog(); log.setDispatchId(dispatchId); log.setDispatchFormerOrderStatus((long) from); log.setDispatchLastOrderStatus((long) to); log.setDispatchLogEvent((long) event); getApplicationContext().getBean(DispatchFsmService.class).insertStatusLog(log); }
④日志插入的实现类
@Service @Slf4j public class DispatchFsmService { @Autowired private YiViDispatchOrderStatusLogMapper yiViDispatchOrderStatusLogMapper; //插入日志 public int insertStatusLog(YiViDispatchOrderStatusLog context){ return yiViDispatchOrderStatusLogMapper.insert(context); } }
3.测试用例
测试日志controller
@RestController @Slf4j @RequestMapping("/v1.0/dispatch/fsm") public class DispatchFsmController { @GetMapping(value = "/log") public String testLog(){ insertStatusLog("23546466",1,2,3); return "插入日志"; } }
校对数据库日志记录
好了,我是张星,欢迎加入博主技术交流群,群号:526601468