# 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)