在spring中当一个接口有多个实现类的时候,通过创建简单工厂类,根据传入的不同的参数获取不同的接口实现类。
public interface ExecuteService {
ExecuteEnum getCode();
// 业务方法
void execute();
}
@Service
public class FirstExecuteServiceImpl implements ExecuteService {
@Override
public ExecuteEnum getCode() {
return ExecuteEnum.FIRST;
}
public void execute() {
System.out.println("11111111111");
}
}
@Service
public class SecondExecuteServiceImpl implements ExecuteService {
@Override
public ExecuteEnum getCode() {
return ExecuteEnum.SECOND;
}
public void execute() {
System.out.println("222222222");
}
}
public enum ExecuteEnum {
FIRST,
SECOND,;
}
方案一
@Component
public class ExecuteServiceFactory implements ApplicationContextAware {
private final static Map<ExecuteEnum, ExecuteService> EXECUTE_SERVICES = new HashMap<>();
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Map<String, ExecuteService> types = applicationContext.getBeansOfType(ExecuteService.class);
types.values().forEach(e -> EXECUTE_SERVICES.putIfAbsent(e.getCode(), e));
}
}
方案二
@Component
public class ExecuteServiceFactory implements InitializingBean {
@Autowired
private List<ExecuteService> executeServices;
public final static Map<ExecuteEnum, ExecuteService> EXECUTE_SERVICES = new HashMap<>();
@Override
public void afterPropertiesSet() throws Exception {
executeServices.forEach(l -> EXECUTE_SERVICES.putIfAbsent(l.getCode(), l));
}
}