我想在Spring Boot应用程序中实现strategy design pattern
。我为构造BeanPostProcessor
创建了strategy resolver
:
@Component
public class HandlerInAnnotationBeanPostProcessor implements BeanPostProcessor {
private final UnpHandlersResolver unpHandlersResolver;
public HandlerInAnnotationBeanPostProcessor(UnpHandlersResolver unpHandlersResolver) {
this.unpHandlersResolver = unpHandlersResolver;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
Annotation[] annotations = bean.getClass().getAnnotations();
for (Annotation annotation : annotations) {
if (annotation instanceof HandlerIn) {
if (bean.getClass() != UnpHandler.class)
throw new RuntimeException("Not UnpHandler bean annotated by HandlerIn");
SmevMessageType[] type = ((HandlerIn) annotation).type();
for (SmevMessageType smevMessageType : type) {
unpHandlersResolver.setHandler(smevMessageType, (UnpHandler) bean);
}
}
}
return bean;
}
}
然后我创建解析器:
@Slf4j
@Component
public class UnpHandlersResolverImpl implements UnpHandlersResolver {
private Map<SmevMessageType, UnpHandler> map = new HashMap<>();
@Override
public void setHandler(SmevMessageType messageType, UnpHandler unpHandler) {
map.put(messageType, unpHandler);
}
@Override
public UnpHandler getUnpHandler(SmevMessageType type) {
UnpHandler sendRequestHandler = map.get(type);
if (sendRequestHandler == null)
throw new IllegalArgumentException("Invalid SendRequestHandler type: " + type);
return sendRequestHandler;
}
}
我的BeanPostProcessor
扫描所有带有注释HandlerIn
的bean,并将其添加到解析程序的mup中。我认为这样做是错误的:
unpHandlersResolver.setHandler(smevMessageType, (UnpHandler) bean);
但是我不明白如何向查找程序添加查找bean。在此实现之前,我在@Postconstruct
的{{1}}方法中找到了bean,例如:
resolver
但是在此解决方案中,我在context.getBeansWithAnnotation(HandlerIn.class);
中有context
,但我认为这很糟糕。
告诉我如何正确实现我想要的?简而言之,我想拥有一组实现不同行为的类。还有控制它们的类。给班级一个参数,以便他选择正确的策略并将其提供给我。像这样:
resolver
答案 0 :(得分:-1)
我将尝试举一个简单的例子。
Interface Greeting {
void sayHello();
String getSupportedLanguage();
}
然后,您有X个实现,可以在“解析器”的构造函数中循环遍历它们来构建映射。 (不过,我在代码中已经看到了这称为Proxy或Decorator,即GreetingProxy或GreetingDecorator)
@Service
public GreetingResolver {
private Map<String, Greeting> languageToGreetingMap = new HashMap<>();
@Autowired
public GreetingResolver(List<Greeting> greetings) {
for (Greeting greeting : greetings) {
languageToGreetingMap.put(greeting.getSupportedLanguage(), greeting);
}
}
public void sayGreetingForLanguage(String language) {
languageToGreetingMap.get(language).sayHello();
}
}
这是一个如何在Spring中完成策略模式的基本示例。 “问候”的每个接口实现都只知道自身及其支持的内容。然后,我们将所有实现自动连接到列表中,并循环遍历以创建映射一次,然后在运行时仅检索和使用映射中的相关条目。
注意:这是直接在网页上输入的“自由手”,因此请原谅代码中的任何错字。