1.概述

pull service的功能是将对象置入模板中。被pull service放到模板中的对象,不需要应用程序的干预即可直接使用。如果模板没有用到某个对象,则不会产生创建该对象的开销。看起来,这些对象像是被模板主动“拉”进context的,而不是由应用程序push进context中的。这就是pull service名称的来源。

2.作用域

global :就是singleton,在系统启动时创建实例。
request :在每个request的第一次访问该tool时,自动创建实例。
注意,!ToolFactory和ToolSetFactory本身一定是singleton的。但他们所创建的tool对象的作用域,是由ToolFactory或ToolSetFactory.isSingleton方法决定的。

3.全局性

parent context中的tools被所有子context中的tools共享。但子context可以覆盖父context中的同名tools(注:只是以当前context的tool的引用为优先,不影响父context中的实例)。

4.使用

<services:pull xmlns="http://www.alibaba.com/schema/services/pull/factories">
< … />
/services:pull>

5.ID命令约定

<tool id="xxx">,(明确指定)此时id=xxx
<tool class="com....!HelloTool>,此时id=hello
<tool class="com....Hello>,此时id=hello
<hello-tool > 此时id=hello

6.共享实例

如果每个sub context中分别配置pull service,那么即使同名的tool,在内存中也是两份实例。
如果希望多个sub context中共享一个实例,就把它定义在parent context中。

7.使用方法

package com.alibaba.webx.tutorial1.app1.tool;

import java.text.SimpleDateFormat;
import java.util.Date; public class MyPullTool{ public static String method1(){
return "hello, xiao xiong!";
} public String method2(Date date){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String new_date = format.format(date);
return new_date;
}
}

在webx.xml配置

<services:pull xmlns="http://www.alibaba.com/schema/services/pull/factories">
<utils />
<page-tool />
<control-tool />
<uris-tool />
<bean-tool id="mytool" class="com.alibaba.webx.tutorial1.app1.tool.MyPullTool" scope="global" autowire="true"/>
</services:pull>

在vm中使用方式

$rundata.response.setContentType("text/html")
$rundata.setLayoutEnabled(false)
<p>Welcome!</p>
今天是 $mytool.method2($date)

优势:使用bean-tool

1你可以方便的将已有的一个工具类配置一下就可以变成PullTool而不需要专门实现任何接口、去除了对原有类的不必要侵入,
2可以将Spring容器的一个Bean作为PullTool使用

8.扩展

8.1.1 创建新的tool factory

public class MyToolFactory implements ToolFactory {

    private boolean singleton = true;

    private DomTool tool;

    public void setSingleton(boolean singleton) {
this.singleton = singleton;
} public Object createTool() throws Exception {
if (this.singleton) {
if (tool == null) {
tool = new DomTool();
} return tool;
} else {
return new DomTool();
}
} public boolean isSingleton() {
return this.singleton;
}
}
public class DomTool {
public void addScript(String scriptURI) {
}
public void addCss(String cssURI) {
}
}

8.1.2 配置

<factory id="domTool" class="com.alibaba.sample.showcase.commons.pull.MyToolFactory" p:singleton="true" />

8.1.3 模板中使用

$domTool.addScript("scripts/test.js");

8.2.1 实现ToolSetFactory

public class MyToolSetFactory implements ToolSetFactory {

    private boolean singleton = true;

    Map<String, Object> tools = new ConcurrentHashMap<String, Object>();

    public MyToolSetFactory() {
tools.put("toolA", new ToolA());
tools.put("toolB", new ToolB());
} public void setSingleton(boolean singleton) {
this.singleton = singleton;
} public Object createTool(String name) throws Exception {
Object tool = null;
if (this.singleton) {
tool = tools.get(name);
} else {
tool = this.makeTool(name);
} if (tool == null) {
throw new RuntimeException("tool '" + name + "' is not found");
}
return tool;
} public Iterable<String> getToolNames() {
return this.tools.keySet();
} public boolean isSingleton() {
return this.singleton;
} private Object makeTool(String name) {
if ("toolA".equals(name)) {
return new ToolA();
} else if ("toolB".equals(name)) {
return new ToolB();
}
return null;
}
}

8.2.2 配置

<factory id="myToolSet" class="com.alibaba.sample.showcase.commons.pull.MyToolSetFactory" p:singleton="true" />

8.2.3 使用

$toolA.say("hello toolA")
$toolB.sing("happy birthday")

  

Webx pull service的更多相关文章

  1. Webx框架自带的petstore

    Webx框架:http://openwebx.org/ petstore:webx3/webx-sample/petstore/tags/3.0/petstore 编译之后:mvn jetty:run ...

  2. Webx MVC分析(转)

    Webx框架:http://openwebx.org/ petstore:webx3/webx-sample/petstore/tags/3.0/petstore 编译之后:mvn jetty:run ...

  3. Webx示例-PetStore分析1

    1. 下载源码 2. 启动容器,加载组件--WebxContextLoaderListener WebxContextLoaderListener继承自org.springframework.web. ...

  4. pull类型消息中间件-消息发布者(一)

    消息集群架构 对于发送方来说的关键几要素 topic 消息的主题,由用户定义.类似于知乎的话题,Producer发送消息的时候需要指定发送到某一个topic下面,Consumer从某一个topic下面 ...

  5. dubbo-admin-2.5.3 运行报错: Bean property 'URIType' is not writable or has an invalid 解决方法

    因为 jdk 是1.8的版本,和 dubbo-admin 存在兼容性问题.所以报错: Bean property 'URIType' is not writable or has an invalid ...

  6. webx--petstore

    配置对应环境,运行petstore 通过官网给的命令行方法,来运行petstore petstore是java ee的经典学习案例,下载链接 如何运行呢? 参见官网给的指导:webx官网 git cl ...

  7. dubbo入门学习

    官方网址:http://dubbo.apache.org/zh-cn/index.html 学习可以参考官网中文文档:http://dubbo.apache.org/zh-cn/docs/user/q ...

  8. RocketMQ源码 — 三、 Producer消息发送过程

    Producer 消息发送 producer start producer启动过程如下图 public void start(final boolean startFactory) throws MQ ...

  9. 使用docker-compose 大杀器来部署服务 上

    使用docker-compose 大杀器来部署服务 上 我们都听过或者用过 docker,然而使用方式却是仅仅用手动的方式,这样去操作 docker 还是很原始. 好吧,可能在小白的眼中噼里啪啦的对着 ...

随机推荐

  1. BZOJ 2716 Violet 3 天使玩偶 CDQ分治

    题目大意:初始给定平面上的一个点集.提供两种操作: 1.将一个点增加点集 2.查询距离一个点最小的曼哈顿距离 K-D树是啥...不会写... 我仅仅会CDQ分治 对于一个询问,查询的点与这个点的位置关 ...

  2. MFC数据类型(data types)

    为便于理解MFC库函数中的各种形参,现将MFC中常见的参数类型总结如下: 下面这些是和Win32程序(SDK程序)共同使用的数据类型: 数据类型 意义 BOOL Boolean值(布尔值,不是TRUE ...

  3. pl/sql developer 编码格式设置(转)

    一.pl/sql developer 中文字段显示乱码 原因:因为数据库的编号格式和pl /sql developer的编码格式不统一造成的. 二.查看和修改oracle数据库字符集: select ...

  4. text选中后displa出label内容

    效果很好而且很简单 用text的click属性即可 private sub text1_click()label1.caption="******"label2.caption=& ...

  5. Oracle中的日期和字符串互相转换

    转载出处:http://blog.sina.com.cn/s/blog_44a005380100k6rv.html TO_DATE格式(以时间:2007-11-02   13:45:25为例)    ...

  6. Asp.Net MVC 控制器

    原文链接:http://www.asp.net/learn/mvc/ 这篇教程探索了ASP.NET MVC控制器(controller).控制器动作(controller action)和动作结果(a ...

  7. MongoDB入门学习(一)—— 安装和启动

    最近由于工作需要,开始学习MongoDB数据库了.第一篇博文就从这里开始吧,以此记录下学习中的点点滴滴,为自己加油呢! (一) MongoDB简介 网上搜搜了一下:(来源:http://www.run ...

  8. Spring MVC返回的json如何去除根节点名称

    spring xml中配置视图如果是如下 <property name="defaultViews"> <list> <bean class=&quo ...

  9. input 输入框获得/失去焦点时隐藏/显示文字(jquery版)

    input输入框在获得或失去焦点时隐藏或显示文字,这样的焦点效果想必很多朋友在填写form表格的时候都曾见识过吧,本文使用jquery实现以下,感兴趣的朋友可以参考下哈 大家可以看效果图的搜索输入框, ...

  10. Linux Apache绑定多域名

    1 网上查到资源不符 网上查到的Apache绑定域名都说要修改http.conf文件,但是我的服务器上的apache是通过apt-get install安装的,安装方法应该是没错的,但是通过find ...