# node **Repository Path**: luecsc/node ## Basic Information - **Project Name**: node - **Description**: 按指定顺序执行spring bean的小工具 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2015-09-23 - **Last Updated**: 2020-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ##Node ####Node简单介绍 Node是一个小工具,它能够按照你配置的顺序来依次执行`spring bean`。 注意:所有的`bean`均需要实现`NodeBeanHandler`接口。Node的原理类似于过滤器,比如`servlet`中的`filter`, 但是它只能在web一层中使用,且通过`web.xml`中配置的`filter`位置来决定其执行顺序,配置复杂也不直观。 当然你仍然可以在业务层通过实现`责任链模式`来处理此类需求,但其每个角色以及执行顺序都已经固定,且新增一个角色时,除了增加角色以外,还需要修改客户端使用角色的代码。 所以就有了Node这样一款小工具,它可以方便的修改整个链条中`bean`的执行顺序,且新增节点`bean`对已有的业务没有任何影响。 Node通过`spring`自定义实现了简单的`schema`用于`bean`顺序的配置。一个简单的`node chain`配置如下 ```xml ``` 使用以上配置,会依次执行:`nodeBeanOne` -> `nodeBeanTwo` -> `nodeBeanThree`,你可以随时修改此配置来定义业务`bean`的执行顺序。 ####Node的应用场景示例 Node作为一个小工具,适用范围非常小,主要用于各种验证流程,资源优先级配置等等。 * 常见的下单流程中,客户端传来下单数据,你需要首先验证商家信息,商品信息(价格,库存等),优惠券优惠码等流程,最后进行下单的流程。 这时候可以使用node,分别定义4个业务`bean`,比如:`MerchantCheckHandler`,`ProductCheckHandler`,`CouponCheckHandler`,`OrderHandler`。 然后按照上文的方式依次配置顺序即可。如果某一天需求有变更,需要先验证优惠券,然后验证商家信息,接着商品,最后下单,那么我们只需要修改配置即可。 ####Node的使用 Node没有提交到任何maven仓库,所以你需要下载源码后通过maven进行编译,你可以通过以下命令编译node: ```shell git clone git@git.oschina.net:luecsc/node.git mvn install ``` 编译成功后会得到node.jar,然后把node加入到你工程的lib中即可使用。当然你也可以将代码提交到本地仓库后使用。 具体示例代码如下: ```java // 测试示例代码 @Test public void test() { String chainId = "chain_test"; Map m = new HashMap(); m.put("name", "csc"); m.put("age", "123"); // NodeManager代码见下文 manager.run(chainId, m); } @Component public class NodeManager implements ApplicationContextAware { private ApplicationContext context; public void setApplicationContext(ApplicationContext context) throws BeansException { this.context = context; } public void run(String chainId,Map params) { NodeChainHandler chain = findNodeChainById(chainId); chain.run(params); } public NodeChainHandler findNodeChainById(String chainId) { Object obj = context.getBean(chainId); if(!(obj instanceof NodeChainHandler)) { throw new NodeException("Cannot find a node chain by: " + chainId); } return (NodeChainHandler)obj; } } ``` ####通过Node你可以获得 Node的实现非常简单,其核心即扩展实现了一个简单的`schema`。所以如果你对`spring`中自定义`schema`的实现以及原理有兴趣的话,Node是一个不错的入门示例。 Node代码量很少,你可以在这个基础上扩展更多的功能: * 热加载配置 * 可以按照当前`bean`的返回值选择下一个要执行的`bean` Node还包含一个简单的示例工程 `node-example`,你可以点击[node-example](http://git.oschina.net/luecsc/node-example)下载测试。 ####有问题反馈 在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流 * 邮件(luecsc#sina.com, 把#换成@) * QQ: 370239447 * weibo: [@CHEN川](http://weibo.com/luecsc)