qlExpress实践手册-spring的融合
来源:互联网 发布:营销qq群发软件 编辑:程序博客网 时间:2024/05/22 15:10
中国绝大部分java应用系统都使用spring作为基础系统架构的一部分。
对于qlExpress脚本引擎来说,能否调用spring bean的方法?怎么调用?是一个非常常见的问题。
以下通过案例来说明。有问题请联系
微信 371754252
或者邮件 tianqiao@taobao.com
比如说你要执行以下的一段qlExpress脚本,除了orderId等普通变量,
还需要传入 bizOrderDao,tradeHsfBean,refundHsfBean 等spring bean变量。
order = bizOrderDao.getOrderById(orderId);if(order.status==2){return tradeHsfBean.syncOrder(order);}else{return refundHsfBean.syncOrder(order);}return null;
方案1:手工注入bean
public void test(){ ExpressRunner runner = new ExpressRunner(); DefaultContext<String, Object> context = new DefaultContext<String, Object>(); Context.put(“orderId”,100012L); Context.put(“bizOrderDao”,getSpringBean("bizOrderDao")); Context.put(“tradeHsfBean”,getSpringBean("tradeHsfBean")); Context.put(“refundHsfBean”,getSpringBean("refundHsfBean")); Object result = runner.execute(text, context, null,true, false); system.out.println(result);}
方案2:扩展上下文,自动注入bean
解决方案:把DefaultContext升级为SpringBeanContext
public class SpringBeanContext extends HashMap<String,Object>implements IExpressContext<String,Object> { private ApplicationContext applicationContext; Public SpringBeanContext(Map<String,Object> aProperties,ApplicationContext applicationContext) { super(aProperties); this.applicationContext = applicationContext; } /** * 根据key从容器里面获取对象 * * @param key * @return */ public Object get(Object key) { Object object = super.get(key); try { if (object == null && this.applicationContext != null && this.applicationContext.containsBean((String)key)) { object = this.applicationContext.getBean((String)key); } } catch (Exception e) { throw new RuntimeException("表达式容器获取对象失败", e); } return object; } /** * 把key-value放到容器里面去 * * @param key * @param value */ public Object put(String key, Object value) { return super.put(key, value); }}@Servicepublic SpringBeanRunner implements ApplicationContextAware{ private ApplicationContext applicationContext; private ExpressRunner runner; @override public void setApplicationContext(ApplicationContext context) { this.applicationContext = context; runner = new ExpressRunner(); } public Object executeExpress(String text,Map<String,Object> context) { IExpressContext<String,Object> expressContext = new SpringBeanContext(context,this.applicationContext); try{ return runner.execute(text, expressContext, null, true, false); }catch(Exception e){ logger.error("qlExpress运行出错!",e); } return null; }}
至此,通过对runner的简单封装,你现在只要直接使用这样的代码就可以轻松完成你对bean的调用了。
@Resourceprivate SpringBeanRunner runner;public void test(){ Map<String, Object> context = new HashMap<String, Object>(); Context.put(“orderId”,100012L); Object result = runner.executeExpress(text, context); system.out.println(result);}
附录:你可能会遇到的坑
1、bean取出来为空
检查下applicationContext里面,对应的com.taobao.XXXX.BizOrderDAO名称是否真的是“bizOrderDAO”
(1)spring注解问题
spring的默认注解使用byType,在applicationContext不是名称,请指定name或者使用ByName
@Service("tradeHsfBean")public class TradeHsfBean{}
(2)ApplicationContext注入失败
SpringBeanRunner没有调用到setApplicationContext(ApplicationContext context) 方法,请调试一下。
阅读全文
0 0
- qlExpress实践手册-spring的融合
- qlExpress实践手册-常用语法介绍
- 基于restful风格的maven项目实践(融合spring)
- QLExpress脚本语言技术讲解(4)------扩展QLExpress来管理spring的bean,写出简单的脚本语言框架
- QLExpress脚本语言技术讲解(6)-------QLExpress的缓存管理
- Mybatis与spring的融合
- nginx的实践手册
- EDA 和 SOA 的融合以及实践
- 融合技术设施的实践应用
- EDA 和 SOA 的融合以及实践
- 结合 spring ,使用QLExpress做一个淘宝的场景模型,对于场景的描述可以参照这个demo
- Ubuntu与XP的硬盘融合 双系统搭建手册
- 第一篇 struts与spring的融合
- 第二篇 Spring与Hibernate的融合
- Struts+Spring+Hibernate的完美融合
- Struts+Spring+Hibernate的完美融合
- DWR3+SPRING+HIBERNATE的初步融合
- DevOps企业实践指南(9): ITSM与Agile的融合
- 求数列的和
- SSM综合项目实战(TTSC) -- day09 Solr,搜索系统
- 高通平台LK传递参数给kernel参考serialno的方式实现
- Android使用fitsSystemWindows属性实现--状态栏【status_bar】各版本适配方案
- idea中如何查看关联资源并显示资源所在目录
- qlExpress实践手册-spring的融合
- docker 的使用(以matcaffe 为例)
- 机器学习中分类算法详解
- Mac制作启动U盘解决重启按option不能识别的问题
- magento 通过key下载插件到本地
- Gradle环境变量配置
- 小米海量数据推送服务技术讲解
- http://www.blogjava.net/zJun/archive/2006/06/28/55511.html
- 侧滑