1. ListableBeanFactory#getBeansOfType
@Slf4j
@Component
public class BusinessExecutor implements ApplicationContextAware {
public Map<String, IExecutor> executorMap = new HashMap<>();
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
// 根据接口类型获取相应的 bean
executorMap = applicationContext.getBeansOfType(IExecutor.class);
log.info("executorMap: " + JSON.toJSONString(executorMap));
}
public Map<String, IExecutor> getExecutorMap() {
return executorMap;
}
}
public interface IExecutor {
void execute(String name);
}
@Service
public class UserExecutor implements IExecutor {
@Override
public void execute(String name) {
System.out.println("UserExecutor...");
}
}
@Service
public class OrderExecutor implements IExecutor{
@Override
public void execute(String name) {
System.out.println("OrderExecutor...");
}
}
2. 自定义方式
@RestController
@RequestMapping("/business")
public class BusinessController {
@Resource
private ExecutorFactory executorFactory;
@RequestMapping("/execute")
public String execute(String businessCode) {
AbstractExecutor executor = executorFactory.processMap.get(businessCode);
return executor.execute();
}
}
@Component
public class ExecutorFactory {
public ConcurrentHashMap<String, AbstractExecutor> processMap = new ConcurrentHashMap<>();
public void register(String name, AbstractExecutor executor) {
if (processMap.containsKey(name)) {
return;
}
processMap.put(name, executor);
}
}
public abstract class AbstractExecutor implements InitializingBean {
@Resource
private ExecutorFactory executorFactory;
@Override
public void afterPropertiesSet() throws Exception {
executorFactory.register(getProcess().name(), this);
}
public abstract ProcessEnum getProcess();
public abstract String execute();
}
@Component
public class QueryExecutor extends AbstractExecutor {
@Override
public String execute() {
return "QueryExecutor";
}
@Override
public ProcessEnum getProcess() {
return ProcessEnum.QUERY;
}
}
@Component
public class UpdateExecutor extends AbstractExecutor {
@Override
public String execute() {
return "UpdateExecutor";
}
@Override
public ProcessEnum getProcess() {
return ProcessEnum.UPDATE;
}
}
public enum ProcessEnum {
QUERY("queryExecutor", "查询"),
UPDATE("updateExecutor", "更新"),
;
private String name;
private String desc;
ProcessEnum(String name, String desc) {
this.name = name;
this.desc = desc;
}
}
网友评论