springboot中循环依赖的解决方法-使用反射
- 循环依赖问题概述
1.1 什么是循环依赖
循环依赖是指两个或多个Bean之间存在相互依赖的关系,形成一个闭环。在Spring容器初始化过程中,如果检测到循环依赖且无法通过三级缓存机制解决,就会抛出BeanCurrentlyInCreationException异常。
解决思路
循环依赖主要是在使用Autowired直接导入service,改变一下思路,并不直接Autowired导入,写一个共同方法,只传入service的名字,就能够获取到对应的service,如果加上参数,就能够实现调用,实际上实现循环调用而不触及循环调用的报警。
共同方法,
public static Object execute(String targetName) throws ReturnMain {String serviceName = RegistryUtil.getChangeName(targetName);Optional<String> optional = Arrays.stream(applicationContext.getBeanDefinitionNames()).filter(name -> StringUtils.equalsIgnoreCase(name, serviceName + SERVICE_SUFFIX)).findFirst();String serviceBeanName = optional.get();try {IService service = (IService) applicationContext.getBean(serviceBeanName);return service.execute();}catch(ReturnMain e) {}finally {CacheUtil.clearKey(CallType.STATIC_CALL.getCacheKey(serviceBeanName));CacheUtil.setData(CallType.VAR_CALL.getCacheKey(serviceBeanName), Boolean.TRUE);}return null;}
调用时传入,
RunServiceHelper.execute("kmzb0010Service");