Broadleaf使用ExtensionManager类实现InvocationHandler来扩展功能(通过extensionHandlers)并提供某种类型的钩子(例如,首先尝试扩展管理器的方法调用,如果没有处理则继续正常)以更改框架类行为而不需要扩展它们并覆盖方法。
我的第一个问题是,如果多态性是解决这个问题的整个范式,那么这种方法背后的动机是什么?有什么好处?
其次,如果我要使用它,那么正确的做法是什么?
例如,我尝试扩展AbstractInventoryServiceExtensionHandler并覆盖方法(因为broadleaf 5.0.1在InventoryServiceImpl中有关于checkQuantitiesAvailable方法中CHECK_QUANTITY InventoryType的错误)
接下来我扩展了InventoryServiceExtensionManager并尝试使用重叠方法注册该extensionHandler
在调用有问题的方法的那一刻 - 我在extensionManager上调用getProxy()方法时遇到错误,说来自Proxy.toString()的ClassCastException和处理程序List是emtpy,而我注册了处理程序?
< / LI>最后,我只是扩展了InventoryServiceImpl并更正了错误,这解决了我的问题但给我留下了上述问题。
答案 0 :(得分:1)
我的第一个问题是,如果多态性是解决这个问题的整个范式,那么这种方法背后的动机是什么?有什么好处?
这允许Broadleaf生态系统中的多个“模块”(插件)在运行时(通过注册自己)而不是在编译时修改行为。这是一个更松散的耦合。此外,如果您需要多次修改代码中的相同位置(例如,您需要多重继承),多态性之类的内容会崩溃。
其次,如果我要使用它,那么正确的方法是什么?
根据您所说的内容,您永远不需要扩展扩展 manager ,而只需扩展 handler 。然后处理程序应该向管理器注册自己。这是一个例子:
@Component
public class MyInventoryExtensionHandler extends AbstractInventoryServiceExtensionHandler {
@Resource
protected InventoryServiceExtensionManager extensionManager;
@PostConstruct
public void init() {
extensionManager.registerHandler(this);
}
@Override
public ExtensionResultStatusType retrieveQuantitiesAvailable(Collection<Sku> skus, Map<String, Object> context, ExtensionResultHolder<Map<Sku, Integer>> result) {
...
...
return ExtensionResultStatusType.HANDLED;
}
}
例如,我尝试扩展AbstractInventoryServiceExtensionHandler并覆盖方法(因为broadleaf 5.0.1在inventoryServiceImplaila方法中有关CHECK_QUANTITY InventoryType的InventoryServiceImpl中有一个错误)
这是什么错误?