策略模式+SpringBoot自动注入
解决springboot环境中策略模式不能注入bean问题,例如导致注入DAO为null
话不多说,上代码
1公共接口
public interface BusinessStrategy{
public void doOperation(String json);
//根据枚举类型分配策略
ScheduleTypeEnum getStyle();
}
2策略1
@Service
public class BusinessStrategyOneImpl implements BusinessStrategy{
@Resource
BusinessDAO BusinessDAO ;
@Override
public void doOperation(String json) {
}
@Override
public ScheduleTypeEnum getStyle() {
return ScheduleTypeEnum.ONE;
}
策略2
@Service
public class BusinessStrategyTwoImpl implements BusinessStrategy{
@Resource
BusinessDAO BusinessDAO ;
@Override
public void doOperation(String json) {
}
@Override
public ScheduleTypeEnum getStyle() {
return ScheduleTypeEnum.TWO;
}
策略3
@Service
public class BusinessStrategyThreeImpl implements BusinessStrategy{
@Resource
BusinessDAO BusinessDAO ;
@Override
public void doOperation(String json) {
}
@Override
public ScheduleTypeEnum getStyle() {
return ScheduleTypeEnum.THREE;
}
3定义Factory
@Service
public class StrategyFactory {
private final List<BusinessStrategy> strategy;
public StrategyFactory (List<BusinessStrategy> strategy) {
this.strategy = strategy;
}
private Map<String,BusinessStrategy> strategies = new ConcurrentHashMap<>();
/**
* 提前注入
*/
@PostConstruct
public void initStrategy() {
Optional.ofNullable(strategy).orElseGet(ArrayList::new)
.forEach(tracer -> {
strategies.put(tracer.getStyle().getType(), tracer);
});
}
/**
* 上下文对象暴露给服务调用端接口,封装实现方式
* @param needIdea
*/
public void useStrategiesg(String type,String json){
strategies.get(type).doOperation(json);
}
}
4测试调用
@Resource
private StrategyFactory factory;
@Test
public void testStart() throws InterruptedException {
factory.useStrategiesg("one","businessData");
}