如何正确使用ExtensionManager和ExtensionHandler实现类

时间:2016-10-18 16:10:08

标签: java spring broadleaf-commerce

  • 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并更正了错误,这解决了我的问题但给我留下了上述问题。

1 个答案:

答案 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中有一个错误)

这是什么错误?