修改循环注入的问题

This commit is contained in:
孙小云 2025-12-16 15:01:38 +08:00
parent 85db6d4823
commit a0eccffb45
7 changed files with 89 additions and 61 deletions

View File

@ -4,7 +4,6 @@ import com.tuoheng.machine.events.AirportEvent;
import com.tuoheng.machine.platform.factory.PlatformStrategyFactory;
import com.tuoheng.machine.platform.strategy.AirportPlatformStrategy;
import com.tuoheng.machine.status.AirportState;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.StateMachine;
@ -21,11 +20,9 @@ import java.util.UUID;
@Configuration
public class AirportMachineConfig {
@Autowired
private PlatformStrategyFactory platformStrategyFactory;
@Bean(name = "airportStateMachineFactory")
public StateMachineFactory<AirportState, AirportEvent> stateMachineFactory() throws Exception {
public StateMachineFactory<AirportState, AirportEvent> stateMachineFactory(
PlatformStrategyFactory platformStrategyFactory) throws Exception {
return new StateMachineFactory<AirportState, AirportEvent>() {
@Override
public StateMachine<AirportState, AirportEvent> getStateMachine() {

View File

@ -4,7 +4,6 @@ import com.tuoheng.machine.events.CoverEvent;
import com.tuoheng.machine.platform.factory.PlatformStrategyFactory;
import com.tuoheng.machine.platform.strategy.CoverPlatformStrategy;
import com.tuoheng.machine.status.CoverState;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.StateMachine;
@ -21,11 +20,9 @@ import java.util.UUID;
@Configuration
public class CoverMachineConfig {
@Autowired
private PlatformStrategyFactory platformStrategyFactory;
@Bean
public StateMachineFactory<CoverState, CoverEvent> coverStateMachineFactory() throws Exception {
public StateMachineFactory<CoverState, CoverEvent> coverStateMachineFactory(
PlatformStrategyFactory platformStrategyFactory) throws Exception {
return new StateMachineFactory<CoverState, CoverEvent>() {
@Override
public StateMachine<CoverState, CoverEvent> getStateMachine() {

View File

@ -4,7 +4,6 @@ import com.tuoheng.machine.events.DrcEvent;
import com.tuoheng.machine.platform.factory.PlatformStrategyFactory;
import com.tuoheng.machine.platform.strategy.DrcPlatformStrategy;
import com.tuoheng.machine.status.DrcState;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.StateMachine;
@ -21,11 +20,9 @@ import java.util.UUID;
@Configuration
public class DrcMachineConfig {
@Autowired
private PlatformStrategyFactory platformStrategyFactory;
@Bean(name = "drcStateMachineFactory")
public StateMachineFactory<DrcState, DrcEvent> drcStateMachineFactory() throws Exception {
public StateMachineFactory<DrcState, DrcEvent> drcStateMachineFactory(
PlatformStrategyFactory platformStrategyFactory) throws Exception {
return new StateMachineFactory<DrcState, DrcEvent>() {
@Override
public StateMachine<DrcState, DrcEvent> getStateMachine() {

View File

@ -4,7 +4,6 @@ import com.tuoheng.machine.events.DroneEvent;
import com.tuoheng.machine.platform.factory.PlatformStrategyFactory;
import com.tuoheng.machine.platform.strategy.DronePlatformStrategy;
import com.tuoheng.machine.status.DroneState;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.StateMachine;
@ -21,11 +20,9 @@ import java.util.UUID;
@Configuration
public class DroneMachineConfig {
@Autowired
private PlatformStrategyFactory platformStrategyFactory;
@Bean(name = "droneStateMachineFactory")
public StateMachineFactory<DroneState, DroneEvent> droneStateMachineFactory() throws Exception {
public StateMachineFactory<DroneState, DroneEvent> droneStateMachineFactory(
PlatformStrategyFactory platformStrategyFactory) throws Exception {
return new StateMachineFactory<DroneState, DroneEvent>() {
@Override
public StateMachine<DroneState, DroneEvent> getStateMachine() {

View File

@ -1,6 +1,7 @@
package com.tuoheng.machine.demo;
import com.tuoheng.machine.manager.AirportSystemManager;
import com.tuoheng.machine.manager.factory.AirportSystemManagerFactory;
import com.tuoheng.machine.platform.factory.PlatformStrategyFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
@ -20,6 +21,7 @@ public class MultiPlatformDemo {
// 获取必要的Bean
PlatformStrategyFactory strategyFactory = context.getBean(PlatformStrategyFactory.class);
AirportSystemManagerFactory managerFactory = context.getBean(AirportSystemManagerFactory.class);
System.out.println("\n========== DJI 机巢系统演示开始 ==========\n");
@ -32,7 +34,7 @@ public class MultiPlatformDemo {
System.out.println("1. DJI机巢上线: " + djiAirport);
System.out.println(" 平台类型: " + strategyFactory.getPlatformType(djiAirport).getName());
AirportSystemManager djiManager = strategyFactory.getSystemManager(djiAirport);
AirportSystemManager djiManager = managerFactory.getManager(djiAirport);
djiManager.airportOnline(djiAirport);
System.out.println(" " + djiManager.getFullStatus(djiAirport));
System.out.println();

View File

@ -0,0 +1,77 @@
package com.tuoheng.machine.manager.factory;
import com.tuoheng.machine.manager.AirportSystemManager;
import com.tuoheng.machine.platform.PlatformType;
import com.tuoheng.machine.repository.AirportPlatformRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 机巢系统管理器工厂
* 根据机巢SN从数据库查询平台类型返回对应的系统管理器
*/
@Component
public class AirportSystemManagerFactory {
@Autowired
private AirportPlatformRepository airportPlatformRepository;
/**
* 存储所有平台的系统管理器实现
* Key: PlatformType
* Value: AirportSystemManager实现
*/
private final Map<PlatformType, AirportSystemManager> managerMap = new ConcurrentHashMap<>();
/**
* 注册所有系统管理器
* Spring会自动注入所有实现了AirportSystemManager的Bean
*/
@Autowired
public void registerManagers(List<AirportSystemManager> managers) {
for (AirportSystemManager manager : managers) {
managerMap.put(manager.getPlatformType(), manager);
System.out.println(String.format("注册系统管理器: %s -> %s",
manager.getPlatformType().getName(), manager.getClass().getSimpleName()));
}
}
/**
* 根据机巢SN获取对应的系统管理器
*
* @param airportSn 机巢序列号
* @return 对应平台的AirportSystemManager实现
* @throws IllegalArgumentException 如果机巢未注册或系统管理器不存在
*/
public AirportSystemManager getManager(String airportSn) {
PlatformType platformType = airportPlatformRepository.getPlatformType(airportSn);
if (platformType == null) {
throw new IllegalArgumentException(
String.format("机巢未注册或平台类型未配置: %s", airportSn));
}
AirportSystemManager manager = managerMap.get(platformType);
if (manager == null) {
throw new IllegalArgumentException(
String.format("未找到平台系统管理器: %s (机巢: %s)", platformType.getName(), airportSn));
}
return manager;
}
/**
* 根据平台类型获取系统管理器
*
* @param platformType 平台类型
* @return 对应平台的AirportSystemManager实现
*/
public AirportSystemManager getManagerByType(PlatformType platformType) {
return managerMap.get(platformType);
}
}

View File

@ -1,6 +1,5 @@
package com.tuoheng.machine.platform.factory;
import com.tuoheng.machine.manager.AirportSystemManager;
import com.tuoheng.machine.platform.PlatformType;
import com.tuoheng.machine.repository.AirportPlatformRepository;
import com.tuoheng.machine.platform.strategy.AirportPlatformStrategy;
@ -52,13 +51,6 @@ public class PlatformStrategyFactory {
*/
private final Map<PlatformType, DrcPlatformStrategy> drcStrategyMap = new ConcurrentHashMap<>();
/**
* 存储各平台对应的系统管理器实现
* Key: PlatformType
* Value: AirportSystemManager实现
*/
private final Map<PlatformType, AirportSystemManager> managerMap = new ConcurrentHashMap<>();
/**
* 注册所有平台策略
* Spring会自动注入所有实现了AirportPlatformStrategyCoverPlatformStrategyDronePlatformStrategy和DrcPlatformStrategy的Bean
@ -68,8 +60,7 @@ public class PlatformStrategyFactory {
List<AirportPlatformStrategy> airportStrategies,
List<CoverPlatformStrategy> coverStrategies,
List<DronePlatformStrategy> droneStrategies,
List<DrcPlatformStrategy> drcStrategies,
List<AirportSystemManager> systemManagers) {
List<DrcPlatformStrategy> drcStrategies) {
// 注册机巢策略
for (AirportPlatformStrategy strategy : airportStrategies) {
@ -98,13 +89,6 @@ public class PlatformStrategyFactory {
System.out.println(String.format("注册DRC平台策略: %s -> %s",
strategy.getPlatformType().getName(), strategy.getClass().getSimpleName()));
}
// 注册系统管理器
for (AirportSystemManager manager : systemManagers) {
managerMap.put(manager.getPlatformType(), manager);
System.out.println(String.format("注册系统管理器: %s -> %s",
manager.getPlatformType().getName(), manager.getClass().getSimpleName()));
}
}
/**
@ -159,29 +143,6 @@ public class PlatformStrategyFactory {
return strategy;
}
/**
* 根据机巢SN获取对应的平台系统管理器
*
* @param airportSn 机巢序列号
* @return 对应平台的AirportSystemManager实现
*/
public AirportSystemManager getSystemManager(String airportSn) {
PlatformType platformType = airportPlatformRepository.getPlatformType(airportSn);
if (platformType == null) {
throw new IllegalArgumentException(
String.format("机巢未注册或平台类型未配置: %s", airportSn));
}
AirportSystemManager manager = managerMap.get(platformType);
if (manager == null) {
throw new IllegalArgumentException(
String.format("未找到平台系统管理器: %s (机巢: %s)", platformType.getName(), airportSn));
}
return manager;
}
/**
* 根据平台类型获取机巢平台策略