在Velocity1.2版本以后,开发者现在又两种选择来使用Velocity引擎,单例模型(singleton model)和单独实例模型(separate instance model)。这是相同的核心代码的2种使用方式,他们都提供了简单地将Velocity集成到你的Java应用中。

单一实例模式(Singleton Model)

这是一个传统模式,Velocity引擎在JVM中(或者是一个Web应用)只有一个共享实例,它可以非常方便的允许局部配置并且共享资源。举一个例子,在使用Servlet 2.2+兼容的Web应用中,每个Web应用程序都可以有自己的运行实例,这就是一个非常合适的模型。

 1 import org.apache.velocity.app.Velocity;
 2 import org.apache.velocity.Template;
 3
 4 ...
 5
 6 /*
 7  *  Configure the engine - as an example, we are using
 8  *  ourselves as the logger - see logging examples
 9  */
10
11 Velocity.setProperty(
12     Velocity.RUNTIME_LOG_LOGSYSTEM, this);
13
14 /*
15  *  now initialize the engine
16  */
17
18 Velocity.init();
19
20 ...
21
22 Template t = Velocity.getTemplate("foo.vm");

单独实例模型(Separate Instance)

1.2版本新出来的,单独实例模式允许你创建、配置并且在JVM(或者Web应用)上,Velocity实例的数量你想要多少就可以使用多少。当你希望支持分散的配置的时候这个是非常有用的,比如在同一个应用的模版路径,日志等等。为了使用单独实例,将使用org.apache.velocity.app.VelocityEngine类。举个例子,和上面的单例例子对应:

 1 import org.apache.velocity.app.VelocityEngine;
 2 import org.apache.velocity.Template;
 3
 4 ...
 5
 6 /*
 7  *  create a new instance of the engine
 8  */
 9
10 VelocityEngine ve = new VelocityEngine();
11
12 /*
13  *  configure the engine.  In this case, we are using
14  *  ourselves as a logger (see logging examples..)
15  */
16
17 ve.setProperty(
18     VelocityEngine.RUNTIME_LOG_LOGSYSTEM, this);
19
20 /*
21  *  initialize the engine
22  */
23
24 ve.init();
25
26 ...
27
28 Template t = ve.getTemplate("foo.vm");

就像你看到的,这个是非常简单明了的。在使用Velocity单一实例还是单独实例的需求上,除了一些简单语法上的变化,在应用和模版中没有其他高级别数据结构的变化。

作为一个程序员,如果使用单一实例的话,使用Velocity的内部类org.apache.velocity.app.Velocity,如果你使用非单一实例模型的话则使用org.apache.velocity.app.VelocityEngine。

在任何时候需要应用使用org.apache.velocity.runtime包内部的Runtime,RuntimeConstants,RuntimeSingleton或者RuntimeInstance类,因为这些是供内部使用,所以可能会随时间而改变。就像上面提到的,这些位于org.apache.velocity.runtime包里的类,也是Velocity和VelocityEngine的类。如果当需要这些类的时候无法找到,不要犹豫提议变化 - 这些类都是为应用开发者提供的。

转载于:https://www.cnblogs.com/treerain/p/velocity_singleton_or_separate_instance.html

Velocity - 单例还是非单例相关推荐

  1. Unity3D C# 单例属性和单例模板及优缺点

    1.什么是单例模式 相信我们都遇到过这样的问题: 我们使用new创建对象,这个对象需要全局共享只用这一个 我们需要用一种简单的方式全局能访问一个类创建的唯一对象 总结下来,我们经常需要创建一个类的单例 ...

  2. Java---设计模块(单例的变形)(多例)

    设计模式1--单例变形(多例) ★ 缓存在单例中的使用 缓存在编程中使用很频繁,有着非常重要的作用,它能够帮助程序实现以空间换取时间,通常被设计成整个应用程序所共享的一个空间,现要求实现一个用缓存存放 ...

  3. c# 多线程单例模式_单例模式,多线程单例,双重锁定单例,工场单例创建上下文...

    单例模式,多线程单例,双重锁定单例,工厂单例创建上下文. 单例子模式定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个 ...

  4. Spring容器中 singleton 单例、 prototype多例

    项目开发中通常会使用:singleton 单例. prototype多例 Singleton: 在一个spring容器中,对象只有一个实例.(默认值) Prototype: 在一个spring容器中, ...

  5. scala什么是单例对象_Scala单例和伴侣对象

    scala什么是单例对象 Scala中的单例对象 (Singleton objects in Scala) Scala being an object-oriented programming lan ...

  6. 现在短视频书单号还能不能赚钱?

    现在在抖音上做书单号还能不能赚钱?关于这种现在还能不能干嘛干嘛的问题,如果你提出这样的问题,说明你处于犹豫不定的茫然之中.我们要告诉你的是,无论什么时候,赚钱是肯定的.只是我们现在互联网的趋势在短视频 ...

  7. php ci提交表单验证,ci表单验证代码

    概述 这是只考虑php对表单数据的接收处理.至于js部分以前会结合validate来讲解下 在解释 CodeIgniter 的数据验证处理之前,让我们先描述一下一般的情况: 一个表单显示了. 你填写并 ...

  8. Struts2 表单和非表单标签

    学习内容 Struts 2表单标签 Struts 2非表单标签 能力目标 熟练使用Struts 2表单标签开发表单 熟练使用Struts 2非表单标签 本章简介 上一章讲述了ognl和Struts2标 ...

  9. html表单自动提交表单提交表单数据类型,表单

    表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法. 表单域:包含了文本框.密码框.隐藏域.多行文本框. ...

最新文章

  1. java实现简单的约瑟夫环问题(二)
  2. python编程语言基础
  3. Hadoop详解(四):HDFS shell操作和Java API操作
  4. Linux 打开/关闭CPU命令
  5. svn: Checksum mismatch while updating 'D:\workspace\demo\test\.svn\text-base\test.php.svn-base'
  6. Python语言学习之字母S开头函数使用集锦:set/sys/super用法之详细攻略
  7. verilog中值滤波算法实现及仿真
  8. python中打开文件时只允许写入的模式是_详解python中各种文件打开模式
  9. Windows API ——WritePrivateProfileString——配置文件
  10. Unity 可重复随机数
  11. 【BZOJ3144】[Hnoi2013]切糕 最小割
  12. 关于学习数据库基础的一点心得体会
  13. 4课:第一个单片机小程序 2020-11-15
  14. 京东广告轮播自动HtML小案例
  15. IBM小型机更换硬盘详细步骤
  16. 使用阿里云和gcr.azk8s.cn镜像安装Kubernetes (K8s)
  17. Faster Read: Deep High Dynamic Range Imaging with Large Foreground Motions
  18. 【游戏开发创新】当我学了Blender 建模,自制3D电脑桌面,回收站爆发了,把我做的模型都吐了出来(Blender | Unity | FBX)
  19. 【Linux命令篇】文档笔记
  20. 两种降维方法的总结——LLE(局部线性嵌入),ISOMAP(等度量映射)

热门文章

  1. python 常见的异常类型
  2. Homebrew:无法符号链接,/ usr / local / bin不可写[关闭]
  3. brew update:以下未跟踪的工作树文件将被合并覆盖:
  4. 如何列出npm用户安装的软件包?
  5. 如何列出引用SQL Server中给定表的所有外键?
  6. python自带sqlite_python内置的sqlite3模块,使用其内置数据库
  7. Linux:yum配置和使用
  8. 移动机器人构型对比分析
  9. 单麦克纳姆轮的速度分解
  10. js方法点击复制文本