1.生命一个注解 用于标记策略类
import java.lang.annotation.*;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface HandlerReportSubjectType {
/**
* 策略类型
* @return
*/
int value();
}
2.定义策略接口:
/**
* 批改报告策略
*/
public interface ReportStrategy {
3.实现策略:
@Slf4j
@Component
@HandlerReportSubjectType(SubjectBo.CH)
public class ChineseReportStrategy implements ReportStrategy {
4.声明一个map用于收集策略类Bean对象,并实现策略提取方法:
getOrderStrategy(Integer subjectId)
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Component
public class ReportContext {
@Autowired
private ApplicationContext applicationContext;
public static Map> reportStrategyBeanMap= new ConcurrentHashMap<>();
public ReportStrategy getOrderStrategy(Integer subjectId){
ClassstrategyClass = reportStrategyBeanMap.get(subjectId);
if(strategyClass == null) {
throw new BusinessException("没有对应的试题批改报告类型");
}
return applicationContext.getBean(strategyClass);
}
}
5.用map收集策略类Bean对象:
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* 将对应的class初始化到HandlerOrderContext中
*/
@Component
public class HandlerReportProcessor implements ApplicationContextAware {
/**
* 获取所有的策略Beanclass 加入HandlerOrderContext属性中
*
* @param applicationContext
* @throws BeansException
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
//获取所有策略注解的Bean
MapcomposeStrategyMap = applicationContext.getBeansWithAnnotation(HandlerReportSubjectType.class);
composeStrategyMap.forEach((k, v) -> {
ClassreportStrategyClass = (Class) v.getClass();
int type = reportStrategyClass.getAnnotation(HandlerReportSubjectType.class).value();
//将class加入map中,type作为key
ReportContext.reportStrategyBeanMap.put(type, reportStrategyClass);
});
}
}
6.具体使用:
ReportStrategy reportStrategy = reportContext.getOrderStrategy(insightExamBatch.getSubjectId().intValue());
return reportStrategy.teacherOverview(batchId, classId, type,insightExamBatch);