适应于策略模式
/**
* 自定义注解
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface Action{
Type value();
}
/**
* 自定义类型
*/
@Getter
@AllArgsConstructor
public enum Type {
BALANCE("B","余额"),
POINTS("P","积分")
;
private String code;
private String message;
public static Type of(String code) {
String message = String.format(ErrorCode.ENUM_CODE_NOT_SUPPORT.message(), "ActionType", code);
return Stream.of(ActionType.values()).filter(actionType -> actionType.getCode().equals(code)).findFirst().orElseThrow(() -> new BizException(ErrorCode.ENUM_CODE_NOT_SUPPORT.code(), message));
}
}
/**
* 选择上下文,把含有注解的类 注入到spring
*/
@Component
public class ActionContext implements BeanPostProcessor {
public final static Map<ActionType, IActionStrategy> strategyMap = Maps.newHashMap();
private final static TransmittableThreadLocal<TriggerActionDP> context = new TransmittableThreadLocal<>();
public static void clear() {
ActionContext.context.remove();
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
ActionKey actionKey = AnnotationUtils.findAnnotation(bean.getClass(), ActionKey.class);
if (actionKey != null && IActionStrategy.class.isAssignableFrom(bean.getClass())) {
strategyMap.put(actionKey.value(), (IActionStrategy) bean);
}
return bean;
}
public static void set(TriggerActionDP triggerAction) {
context.set(triggerAction);
}
public static TriggerActionDP get() {
return context.get();
}
}
/**
* 策略类,做一些业务处理
*/
@Slf4j
@ActionKey(ActionType.BALANCE)
public class ActionBalanceStrategy extends AbstractFundStrategy {
/**
*
*/
@Override
public void doSomething() {
}
}
//选择处理具体的子类执行任务
Type type = Type.of(actionType);
ActionContext.strategyMap.get(type).doSomething();