??xml version="1.0" encoding="utf-8" standalone="yes"?>
当铲q井里的泥土落在驴子的背部时Q?br />驴子的反应o(h)人称奇──它将泥土抖落在一旁,然后站到铲进的惔土堆上面
如驴子的情况,在生命的旅程中,有时候我们难免会(x)陷入「枯井」里Q?br />?x)被各式各样的「惔沙」們ր在我们w上Q?br />而想要从q些「枯井」脱困的U诀是Q将「惔沙」抖落掉Q然后站C去!
L(fng)C下五个快乐的秘诀Q?br />1. 不要存有憎恨的念头?br />2. 不要让忧虑沾染你的心?br />3. 单地生活?br />4. 多分享?br />5. 欲求?/strong>
版权声明Q本文可以自p{载,转蝲时请务必以超链接形式标明文章原始出处和作者信息及(qing)本声?/span>
作?cleverpig(作者的Blog:http://blog.matrix.org.cn/page/cleverpig)
原文:[http://www.matrix.org.cn/resource/article/44/44048_Java+Annotation.html]http://www.matrix.org.cn/resource/article/44/44048_Java+Annotation.html[/url]
关键?Java,annotation,标注
摘要Q?/span>
本文针对java初学者或者annotation初次使用者全面地说明了annotation的用方法、定义方式、分cR初学者可以通过以上的说明制作简单的annotationE序Q但是对于一些高U的annotation应用Q例如用自定义annotation生成javabean映射xml文gQ还需要进一步的研究和探讨。涉?qing)到深入annotation的内容,作者将在后文《Java Annotation高应用》中谈到?br />
同时Qannotationq行存在两种方式Q运行时、编译时。上文中讨论的都是在q行时的annotation应用Q但在编译时的annotation应用q没有涉?qing)?br />
一、ؓ(f)什么用AnnotationQ?/span>
在JAVA应用中,我们帔RC些需要用模版代码。例如,Z~写一个JAX-RPC web serviceQ我们必L供一Ҏ(gu)口和实现作ؓ(f)模版代码。如果用annotation对远E访问的Ҏ(gu)代码q行修饰的话Q这个模版就能够使用工具自动生成?br />另外Q一些API需要用与E序代码同时l护的附属文件。例如,JavaBeans需要一个BeanInfo Class与一个Bean同时使用/l护Q而EJB则同样需要一个部|描q符。此时在E序中用annotation来维护这些附属文件的信息十分便利而且减少了错误?br />
二、Annotation工作方式Q?/span>
?.0版之前的Javaq_已经h了一些ad hoc annotation机制。比如,使用transient修饰W来标识一个成员变量在序列化子pȝ中应被忽略。而@deprecatedq个javadoc tag也是一个ad hoc annotation用来说明一个方法已q时。从Java5.0版发布以来,5.0q_提供了一个正式的annotation功能Q允许开发者定义、用自qannoatationcd。此功能׃个定义annotationcd的语法和一个描qannotation声明的语法,dannotaion的APIQ一个用annotation修饰的class文gQ一个annotation处理工具QaptQ组成?br />annotationq不直接影响代码语义Q但是它能够工作的方式被看作cME序的工h者类库,它会(x)反过来对正在q行的程序语义有所影响。annotation可以从源文g、class文g或者以在运行时反射的多U方式被d?br />当然annotation在某U程度上使javadoc tag更加完整。一般情况下Q如果这个标记对java文档产生影响或者用于生成java文档的话Q它应该作ؓ(f)一个javadoc tagQ否则将作ؓ(f)一个annotation?br />
三、Annotation使用Ҏ(gu)Q?/span>
1。类型声明方式:(x)
通常Q应用程序ƈ不是必须定义annotationcdQ但是定义annotationcdq难事。Annotationcd声明于一般的接口声明极ؓ(f)cMQ区别只在于它在interface关键字前面用“@”符受?br />annotationcd的每个方法声明定义了一个annotationcd成员Q但Ҏ(gu)声明不必有参数或者异常声明;Ҏ(gu)q回值的cd被限制在以下的范_(d)(x)primitives、String、Class、enums、annotation和前面类型的数组Q方法可以有默认倹{?br />
下面是一个简单的annotationcd声明Q?br />清单1:
/**
* Describes the Request-For-Enhancement(RFE) that led
* to the presence of the annotated API element.
*/
public @interface RequestForEnhancement {
int id();
String synopsis();
String engineer() default "[unassigned]";
String date(); default "[unimplemented]";
}
代码中只定义了一个annotationcdRequestForEnhancement?br />
2。修饰方法的annotation声明方式Q?/b>
annotation是一U修饰符Q能够如其它修饰W(如public、static、finalQ一般用。习(fn)惯用法是annotaions用在其它的修饰符前面。annotations由“@+annotationcd+带有括号的成?值列表”组成。这些成员的值必L~译时常量(卛_q行时不变)?br />
AQ下面是一个用了RequestForEnhancement annotation的方法声明:(x)
清单2:
@RequestForEnhancement(
id = 2868724,
synopsis = "Enable time-travel",
engineer = "Mr. Peabody",
date = "4/1/3007"
)
public static void travelThroughTime(Date destination) { ... }
BQ当声明一个没有成员的annotationcd声明Ӟ可用以下方式:(x)
清单3:
/**
* Indicates that the specification of the annotated API element
* is preliminary and subject to change.
*/
public @interface Preliminary { }
作ؓ(f)上面没有成员的annotationcd声明的简写方式:(x)
清单4:
@Preliminary public class TimeTravel { ... }
CQ如果在annotations中只有唯一一个成员,则该成员应命名ؓ(f)valueQ?br />清单5:
/**
* Associates a copyright notice with the annotated API element.
*/
public @interface Copyright {
String value();
}
更ؓ(f)方便的是对于h唯一成员且成员名为value的annotationQ如上文Q,在其使用时可以忽略掉成员名和赋值号Q?Q:(x)
清单6:
@Copyright("2002 Yoyodyne Propulsion Systems")
public class OscillationOverthruster { ... }
3。一个用实例:(x)
l合上面所讲的Q我们在q里建立一个简单的Zannotation试框架。首先我们需要一个annotationcd来表C某个方法是一个应该被试工具q行的测试方法?br />清单7:
import java.lang.annotation.*;
/**
* Indicates that the annotated method is a test method.
* This annotation should be used only on parameterless static methods.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test { }
值得注意的是annotaioncd声明是可以标注自qQ这L(fng)annotation被称为“meta-annotations”?br />
在上面的代码中,@Retention(RetentionPolicy.RUNTIME)q个meta-annotation表示了此cd的annotation被虚拟Z留其能够在q行旉过反射被读取。而@Target(ElementType.METHOD)表示此类型的annotation只能用于修饰Ҏ(gu)声明?br />
下面是一个简单的E序Q其中部分方法被上面的annotation所标注Q?br />清单8:
public class Foo {
@Test public static void m1() { }
public static void m2() { }
@Test public static void m3() {
throw new RuntimeException("Boom");
}
public static void m4() { }
@Test public static void m5() { }
public static void m6() { }
@Test public static void m7() {
throw new RuntimeException("Crash");
}
public static void m8() { }
}
Here is the testing tool:
import java.lang.reflect.*;
public class RunTests {
public static void main(String[] args) throws Exception {
int passed = 0, failed = 0;
for (Method m : Class.forName(args[0]).getMethods()) {
if (m.isAnnotationPresent(Test.class)) {
try {
m.invoke(null);
passed++;
} catch (Throwable ex) {
System.out.printf("Test %s failed: %s %n", m, ex.getCause());
failed++;
}
}
}
System.out.printf("Passed: %d, Failed %d%n", passed, failed);
}
}
q个E序从命令行参数中取出类名,q且遍历此类的所有方法,试调用其中被上面的试annotationcd标注q的Ҏ(gu)。在此过E中Z扑և哪些Ҏ(gu)被annotationcd标注q,需要用反的方式执行此查询。如果在调用Ҏ(gu)时抛出异常,此方法被认ؓ(f)已经p|Qƈ打印一个失败报告。最后,打印q行通过/p|的方法数量?br />下面文字表示了如何运行这个基于annotation的测试工P(x)
清单9:
$ java RunTests Foo
Test public static void Foo.m3() failed: java.lang.RuntimeException: Boom
Test public static void Foo.m7() failed: java.lang.RuntimeException: Crash
Passed: 2, Failed 2
四、Annotation分类Q?/span>
Ҏ(gu)a(chn)nnotation的用方法和用途主要分Z下几c:(x)
1。内建Annotation——Java5.0版在java语法中经常用到的内徏AnnotationQ?/b>
@Deprecated用于修饰已经q时的方法;
@Override用于修饰此方法覆盖了父类的方法(而非重蝲Q;
@SuppressWarnings用于通知java~译器禁止特定的~译警告?br />
下面代码展示了内建Annotationcd的用法:(x)
清单10:
package com.bjinfotech.practice.annotation;
/**
* 演示如何使用java5内徏的annotation
* 参考资料:(x)
* http://java.sun.com/docs/books/tutorial/java/javaOO/annotations.html
* http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html
* http://mindprod.com/jgloss/annotations.html
* @author cleverpig
*
*/
import java.util.List;
public class UsingBuiltInAnnotation {
//食物c?br /> class Food{}
//q草c?br /> class Hay extends Food{}
//动物c?br /> class Animal{
Food getFood(){
return null;
}
//使用Annotation声明DeprecatedҎ(gu)
@Deprecated
void deprecatedMethod(){
}
}
//马类-l承动物c?br /> class Horse extends Animal{
//使用Annotation声明覆盖Ҏ(gu)
@Override
Hay getFood(){
return new Hay();
}
//使用Annotation声明止警告
@SuppressWarnings({"deprecation","unchecked"})
void callDeprecatedMethod(List horseGroup){
Animal an=new Animal();
an.deprecatedMethod();
horseGroup.add(an);
}
}
}
2。开发者自定义AnnotationQ由开发者自定义Annotationcd?/b>
下面是一个用annotationq行Ҏ(gu)试的sampleQ?br />
AnnotationDefineForTestFunctioncd定义如下Q?br />清单11:
package com.bjinfotech.practice.annotation;
import java.lang.annotation.*;
/**
* 定义annotation
* @author cleverpig
*
*/
//加蝲在VM中,在运行时q行映射
@Retention(RetentionPolicy.RUNTIME)
//限定此annotation只能标示Ҏ(gu)
@Target(ElementType.METHOD)
public @interface AnnotationDefineForTestFunction{}
试annotation的代码如下:(x)
清单12:
package com.bjinfotech.practice.annotation;
import java.lang.reflect.*;
/**
* 一个实例程序应用前面定义的AnnotationQAnnotationDefineForTestFunction
* @author cleverpig
*
*/
public class UsingAnnotation {
@AnnotationDefineForTestFunction public static void method01(){}
public static void method02(){}
@AnnotationDefineForTestFunction public static void method03(){
throw new RuntimeException("method03");
}
public static void method04(){
throw new RuntimeException("method04");
}
public static void main(String[] argv) throws Exception{
int passed = 0, failed = 0;
//被检的cd
String className="com.bjinfotech.practice.annotation.UsingAnnotation";
//逐个(g)查此cȝҎ(gu)Q当其方法用annotation声明时调用此Ҏ(gu)
for (Method m : Class.forName(className).getMethods()) {
if (m.isAnnotationPresent(AnnotationDefineForTestFunction.class)) {
try {
m.invoke(null);
passed++;
} catch (Throwable ex) {
System.out.printf("试 %s p|: %s %n", m, ex.getCause());
failed++;
}
}
}
System.out.printf("试l果Q?通过: %d, p|Q?%d%n", passed, failed);
}
}
3。用第三方开发的Annotationcd
q也是开发h员所常常用到的一U方式。比如我们在使用Hibernate3.0时就可以利用Annotation生成数据表映配|文Ӟ而不必用Xdoclet?br />
五、ȝQ?/span>
1。前面的文字说明了annotation的用方法、定义方式、分cR初学者可以通过以上的说明制作简单的annotationE序Q但是对于一些高U的annotation应用Q例如用自定义annotation生成javabean映射xml文gQ还需要进一步的研究和探讨?br />
2。同Ӟannotationq行存在两种方式Q运行时、编译时。上文中讨论的都是在q行时的annotation应用Q但在编译时的annotation应用q没有涉?qing),因?f)~译时的annotation要用annotation processing tool?br />
涉及(qing)以上2斚w的深入内容,作者将在后文《Java Annotation高应用》中谈到?br />
六、参考资源:(x)
·Matrix-Java开发者社?http://www.matrix.org.cn
·http://java.sun.com/docs/books/tutorial/java/javaOO/annotations.html
·http://java.sun.com/j2se/1.5.0/docs/guide/apt/GettingStarted.html
·http://java.sun.com/j2se/1.5.0/docs/guide/apt/GettingStarted.html
·http://java.sun.com/j2se/1.5.0/docs/guide/apt/GettingStarted.html
·作者的Blog:http://blog.matrix.org.cn/page/cleverpig
]]>
不值得大费周章L它救出来Q不q无论如何,q口井还是得填v来?于是农夫便请来左d舍帮忙一起将井中的驴子埋了,以免除牠的痛苦?br />农夫的邻居们人手一把铲子,开始将泥土铲进枯井中?br />当这头驴子了解到自己的处境时Q刚开始哭得很凄惨?br />但出人意料的是,一?x)儿之后q头驴子安静下来了?br />农夫好奇地探头往井底一看,出现在眼前的景象令他大吃一惊:(x)
pP驴子大安倒在它n上的泥土全数抖落在井底,然后再站上去?br />很快圎ͼq只驴子便得意地上升C口,
然后在众人惊讶的表情中快步地跑开了!
事实上,我们在生zM所遭遇的种U困难挫折就是加诸在我们w上的「惔沙」;
然而,换个角度看,它们也是一块块的垫脚石Q?br />只要我们锲而不舍地它们抖落掉Q然后站上去Q?br />那么即是掉落到最q井,我们也能安然地脱困?br />本来看似要活埋驴子的丑֊Q由于驴子处理厄境的态度不同Q?br />实际上却帮助了它Q这也是改变命运的要素之一?br />如果我们以肯定、沉着E重的态度面对困境Q助力往往潜藏在困境中?br />一切都军_于我们自己,学习(fn)放下一切得失,勇往直前q向理想?br />我们应该不断地徏立信心、希望和无条件的爱, q些都是帮助我们从生命中的枯井脱困ƈ扑ֈ自己的工兗?/strong>
]]>
X和Y加v来是ZQ我们是q样做的QX是集权的意思,集权的管理,q个集权Q不是政M的集权。就是说Q真正的一把抓。在中国人寿可不可能有一U手下,讨厌做事情,逃避责QQ不喜欢用脑{,有的Q一定有q两个h?/span>
q时候你像牧羊犬那样带着他,底下的h都是牲口Q你把他带v来好了,你不那些猪、牛、羊、马是什么想法,反正l统都是逃避责QQ不喜欢动脑{,你就把他带v来。但是你认ؓ(f)中国人寿Q每个h都是q样吗?
不可能,W二U就出来了,叫做Y理论QY理论Q我们叫做参与管理。一个部下成熟以后,你就应该让他参与。每天在那里动脑{想问题。真正如果有q种手下Q两个加h{于Z。其实中国h寿ƈ不是全部都用X来管的,也不是全部用Y来管的,因ؓ(f)q两Uh其实l统都有?/span>
我们讲到YQ有没有人喜Ƣ接受Q务呢Q怎么?x)没有呢Q中国未来的d假如?**Q那么未来的ȝ是谁Q不知道Q假设我?**ȝ把我们上市?*l找MQ我说王兄啊Q我q纪大了Q准备要退休了Q这个位|让你来坐一坐,你看怎么P你认?*?x)怎么Ԍ
NOQNOQȝ不行Q我q个人只能管一个上P到嘉定已经很勉ZQ一到昆山我就完了Q一过昆山׃塌糊涂,我的能力仅限于上P他会(x)q样讲话吗?不会(x)。他?x)说Q谢谢ȝ的抬爱,你看什么时候上班啊Q?/span>
q就证明Qh喜欢dQ没有h不喜ƢQ务,问题是给他的条g够不够?**先生知道Q到了中央,他的权利是很大的。如果真的一Ҏ(gu)利都没有Q你看他?x)不会(x)愿意去Q?
所以同L(fng)市长Q天z市׃行。天z市长听说凡事向***汇报Q结果天z市弄得现在q个样子。结果天z现在传Z句风凉话Q?**q个市长Q把一个直辖市得县城一栗就是这h的,你要去过天|q道了Q可惜这个地斏V?/span>
我其实三q前到北京和天|我就发现q个现象Q那时我在北京碰到几个高阶层的hQ其实天z和北京两个直辖市靠得这么近Q干脆合q算了。h安说天z离皇上太近Q所以皇上给他一U压q。其实真正的理由是这个理由吗Q天z有条v治I我们上v也有条苏州河Q天z有个v安公路,我们上v有个外WQ其实是一L(fng)?/span>
民国初年的天z,比北京还J荣Q记得吗Q那时候买泊来品还要天z去Q外国领事馆都在天|。袁世凯q住q天z,傅A都住q。所以今天闹成这个样子,说穿了就是管理h员的问题?/span>
我结果讲了讲Q北京笑一W,没想C天传出新的消息,叫做大北京计划,果然不错Q英雄所见略同,大家的想法都一L(fng)。大北京计划出来了,늛天|Q所以北京不好意思把天|q个名字取掉Q但是现在北京开始管天|了?/span>
从明q开始,大北京计划开始了Q北京的高速公路,北京的地下铁Q现在开始要向天z通了Q这p明北京现在要把天z涵盖v来。不q个样子Q那个天z永q变成一个县城?
那么什么叫中和Q是q样做的。我们不可以凡事都讲物质Q认为给人民币就可以了,其实我们q要注意_。我们不能够一动就惩罚Q其实我们还要讲Ȁ励。我不能一动就把制度搬出来吓hӞ其实我们q要重视人心。这些地斚w帔R要,lh民币q个谁都?x)用Q一动就研究奖金Q请问精面你是否注意到Q?/span>
我读q一文章,说中国的企业Q右边这三个q做得不够,是说不太注意h性管理吧Q讲Ch性,我提醒各位,人性跟人情是两个意思。噢Q我圈一个就讲一个,我们光讲物质Q却没有注意到精。那么我来讲一个精上有关的事情。什么东西是一U精面Q?
在宋朝的时候有一个老妈妈,跟他的邻居说Q我那个老三在一个将军的底下打仗受了伤,军亲自跪在C替他扎伤口,说着Q她哭h。很感动是不是?
她说不是的,我的老大原来也在他底下,一受伤Q将军一跪在C替他包扎伤口Q他报销了,打仗奋勇的杀敌,他就很快报销了。后来我那个老二又去Q又受伤Q也是这样包扎的Q也报销了。现在完了,我那个仅存的老三Q看样子也快报销了?/span>
q叫做精面。如果你下次受了伤Q如果我们单M自给你包扎伤口,你很快就报销了。对不对Q你含着眼泪Q快报销了。你回家l你老婆_(d)快报销了,q个伤口是我们单ȝ包扎的。请问,q样子要花多h民币Q不要花多少人民币嘛Q这U观念,叫做_面,其实我们做得不太够?
W二个,惩罚谁都?x)啊Q要记过Q要调职Q要冷冻q不Ҏ(gu)Q问题是你激׃吗?Ȁ励。我有两ơ在摩托|拉Q他们的副d我去参观他们的厂房,一个老美Q走q去的时候看C个中国员工在那里拧汗Q男的,他走到旁边说Q好孩子?/span>
l果他又跟我走到后面MQ一个女的在那里做瓶检验,他又说NICE GIRLQ那个女的也W一W,他就跟我出去了。其实摩托罗拉那个老美Q跟他底下那两个中间?U,9层,请问他ؓ(f)什么这栯Q这个叫做激励?/span>
我后来发玎ͼ西洋人非常注意这一炏V因为我们当ȝ的,每天都快太忙了,不相信我h你们一个问题,你们每天q么忙的时候,每天花几分钟Q下ȝ看你们干部?你每天花几分钟,在办化验室里面走一圈?你干部送上来的那报告,你有没有先称赞再修改Q当人家l你一个提议,你有没有先鼓励,然后指出他的盲点Q?/span>
我们都是Ȁ׃I一动就训,一动就削,一动就拿命令出来唬Q这个其实是~少Ȁq。后来我才发现这个是要从养成的Q原来西方从对他的子女有Ȁ励,所以长大以后就Lq种Ȁq?fn)惯Q?
人类学家辑ְ文,的时候有一天是q样回去的,他爸一看就知道口袋里有什么东西啊Q这Ҏ(gu)出来是只四脚蛇,q边掏出来是只金龟子。小心不要咬到腿了。不?x)的Q长大以后成Zhcd家?a target="_blank">成功|?/font>
如果你的宝是回来是q样子的Q口袋里是什么东西啊Q啊呀Q啪一下,看你象个四脚蛇,赶快去读书!一天到晚玩蛇!q一打,打掉个hcdӞq就是没有激励?
d有个女的来上P专门研究非洲的猩猩珍古dQ她在四岁的时候,有天下午不见Q她妈妈到处扑֥。不见了Q几乎都要到警察局报案了,黄昏的时候,那个家伙出现了,手上拿两个鸡蛋,一w鸡毛,头上q有炚w屎,妈,我孵了一下午孵不出小鸡。原来躲到鸡W里辏V?/span>
她妈妈一看,啊呀Q我的天那!赶快z个澡,我们吃完饭研I一下鸡蛋是怎么늚。吃完饭以后母女两个讲了半天也讲不清楚。她妈妈又不是动物学家?/span>
W二天她妈妈亲自到学校里问老师Q回来再告诉珍古得那时候她才四岁,q种观念叫做Ȁ励。如果是你的奛_一个下午不见了Q结果从鸡笼里出来了Q啪嗒!一下子下去Q她哭了Q你W了。这样子其实叫做没有Ȁ励?
W三个是人性。讲制度谁都?x),公司的制度搬出来谁都?x)Q但是一旦要讲到人性,我们做得又有Ҏ(gu)~。所谓h性,他的意思是q样的,从h的心里面L、思考、观察一U行为?/span>
那么回到我们刚才那个例子Q三得利啤酒厂副厂长的那个爸爸死了,那个副厂长是个上hQ他的爸爸死了,三d利啤酒厂的老d到消息,到他家ȝ他,q个不稀奇啊Q鞠w安C句不E奇,E奇的是他跟他俩个站在一P开始对客h鞠躬?/span>
另外陆箋q有很多的同事来慰问Q三得利啤酒那个ȝ理跟中国的副ȝ在一P一直鞠w,一直谢谢,人家q以Z的爸爸死了。你猜那个副厂长跟我说了句什么话Q他_(d)余先生我没有惛_Q这个ȝ理是q样来的Q所以我q辈子大概要d三得利了?/span>
q就叫做人性,在h性面上激化你。所以日本三得利有个?fn)惯Q部属Q何家里面如果有事,ȝ时候不要光是鞠w,要跟他们的家属站在一P对外人打C|表示我们是一家h。这U就叫做人性?
我以上所讲的例子Q从刚才所讲的三得利,跟我所讲的摩托|拉Q跟我所讲的宋朝军的故事,哪一个需要花钱?q些跟钱都没有关pR统l是Z人的内心Q这U观늻l叫做YQ所以我们的左边是XQ这两个如果l合hQ就是X+Y=Z?/span>
其实在我们中国h寿不可能l统讲X的,也不可能l统讲Y的,是看情况l合hq用。如果我们过度地偏XQ就是一U集权式的管理,但还不到q渡偏Y的时候,你就开始给他参与,也是个ؕ七八p,所以我们要看看视情况而定?
一讲到视情况而定׃(x)有另外一个概念,我们来看一看。你们已l认识的李光耀Q新加坡的前ȝQ他现在已经变成资政了,现在国务院ȝ是胡作栋Q李光耀其实是我们中国h的后裔,所以我拿他举例Q是因ؓ(f)他不是一个真正的西方人,李光耀是广东梅县客家h的后裔,所以,其实他的父亲和祖父与中国人有深厚的渊源?/span>
李光耀虽然从小新加坡长大,可是他受的教育都是儒家的教育和思想。长大以后送到英国剑桥MQ同时带着东西方的的思想Q我觉得q种人是最厉害的。又受过中国儒家的熏Ӟ又到q西方见识过西方世界Q就像邓^一P早年在中国长大,又看q欧zԌ所以对邓小q的攚w开放,跟他到过Ƨ洲肯定很有关系?/span>
李光耀新加坡其实只有四个字,q四个字以表达X与Y的理论,叫做开明专制。他讲得很有道理Q管一个国家和一个社?x),_上面要以量的开明,_可以开明,但是法律一定要专制。所以,新加坡就变成q样子了。其实他的开明就是XQ他的专制就是YQ就是X和Y加v来。新加坡变成这样子了,正好合乎q个道理?/span>
所以精上量开明,在中国h寿,我们采纳不同的意见,允许不同的声韻I接受不同的策略,q个叫精止非常开明。但是中国h寿对一些重要的规定Q重要的要求Q重要的制度Q一定要非常坚持Q这叫法令,是法o(h)要专制?a target="_blank">成功|?/font>
_要开明,其实要管新加坡就是这四个字,q本书其实出版的时候,我一夜之间就把它d了,d天亮Q因为写得很好。这本书原文是英文的Q后来翻成中文,在台湑և版,我想没有多久在大陆可以买得到译本。如果有一天在中国大陆出版Q可以好好的M读,一个国家跟一个公司是完全一L(fng)Q所以,读这个书好象在读企管一P有道理?
在探讨流媒体之前Q我们不妨简要地回顾一下数字信息时代的数字化进E。众所周知Q语音的数字化造就了数字程控交换机和蜂H移动数字电(sh)话技术的发展Q音频和视频的数字化又造就了计机多媒体技术的发展Q多U音视频技术的演变又得传l消费类韌频品的数字化。而承载这U变化的便是语音、音频流、视频流q样的媒体流Q处理这些媒体流需要高性能数字媒体技术?
高性能的数字媒体技术覆盖的是一个广阔的媒体和Z媒体的新兴技术,q便囊括了集成视频、语韟뀁数据内容到许多新的和特色化的应用,q且重新构造数字媒体内Ҏ(gu)供的方式。数字媒体所面(f)的挑战包含实时的性能Q更高的信道密度和Y件编E的灉|性,以适应同时出现的视频、语韟뀁数据流的传输的需要。典型的数字媒体处理视功能包括编码、解码媒体流Q不同格式的码{换,不同速率的流转换Q以适应变化的系l需求。另外还包括压羃、解压,加密、分l化和媒体流的传输等处理功能?
媒体其实是个技术名词,单来说就是采用流技术,xq箋的媄(jing)象和声音信息l过压羃处理Q在|络上实施多媒体文g的实时传输和播放。由于宽带已成ؓ(f)|络架构的重点,媒体的特点是如何运用可变带宽技术,使h们可以在灉|的带宽环境下在线ƣ赏高品质音频和视频节目Q及(qing)臌行实时可视通信。既然流媒体可以适应各种不同|络带宽Q在H带下也同样可以畅的观看、收听,当然Q质量会(x)因带宽的限制而略有媄(jing)响?
媒体实现的关键技术是用流式传输,把声韟뀁媄(jing)像或动画{信息由韌频服务器向用L(fng)端连l地实时传送。这U流式传输系l的多媒体文件经特定压羃方式被解析成压羃包,p频服务器向用L(fng)端顺序或实时传送,用户只需l过几秒的启动g时便可进行观看。在音频和视频等媒体文g在播放时Q文件剩余部分将在后C服务器内l箋下蝲?
媒体技术包含着跨媒体融合的实用技术,其中必然涉及(qing)许多视频和音频标准的应用Q其中不标准尚需不断完善。这些标准的实现可以采用g或Y件技术处理。对于成熟的标准Q可以采用专用硬Ӟ而对于不够成熟的标准Q或是未定国际化的标准Q采用Y件算法实现将更ؓ(f)可行Q其最理想的处理^台就是高速数字信号处理器QDSPQ。由于媒体流产品可进行本地解码,因此实际上消费者看不到其内Ҏ(gu)式,而媒体流讑֤的固有功能性却能够得到q一步增强。如果在设计的中心位|具有一个可~程内核Q原始设备制造商 (OEM) 可通过单的软g下蝲卛_升到新的或修订后的标准。DSP便可提供q样一个将所有这些功能结合v来的核心QOEM 厂商的流媒体产品设计因此而具有不断完善的灉|性以适应不断变化的技术要求?
媒体相x术标?/b>
在流媒体技术中传输的多媒体数据需要预先进行特D的压羃处理Q那么针对不同的应用可以分ؓ(f)面向视频、面向媄(jing)像流、面向音频流和面向语x四类Q将对应不同的处理技术方法,于是有一pd标准和规范?
在视频流中包括侧重于交互应用的H.263Q还有侧重于监控应用M-JPEG。至?MPEG1和MPEG2已在Ȁ光媄(jing)中q泛应用。MPEG4技术的应用当前很多提供声音和数据服务的pȝ得到q一步的扩展Q其所具备的高压羃率和很强的编码容错功能必它在互联|和当前蜂窝通信|络的视频领域得到广泛应用?
H.264是ITU在MPEG4基础上开发出来的新的视频~码法Q具有更高的~码效率、更强的解码差错恢复能力、以?qing)提高了对移动通信和IP|络的适应性。H.264有可能作为MPEG-4的后l技术而成ZU适用于各cȝl的公共技术,因此业界对它在下一代视频通信领域的应用前景普遍寄予厚望。中国在qK的国内多媒体通信市场上占据主动,也在开发拥自主知识产权的AVS标准q已有重大进展?
视频在|络上实现播放时Q媒体播攑֙需要识别媒体文件格式,q从中得到回放所需信息。因特网上用较多的式视频格式有RealNetworks公司所制定的音频视频压~规范称为RealMediaQ是一个跨q_的客?服务器结构的多媒体应用标准。Apple计算机公司的QuickTime是数字媒体领域事实上的工业标准,可以通过|络提供实时的数字化信息、工作流与文化回攑֊能。微软公怹正用其专有的Windows Media技术应用于~解码市场。DivX在该领域也颇具媄(jing)响力?
除视频流之外Q面向媄(jing)像流的标准包括JPEG、GIFF、TIFF、位囄Q面向音频的标准有AAC?ATRAC3?MP3?WMA{;而面向语音的标准有AMR, G.723.1, G.726, G.711QG.722QG.728QG.729{?
媒体采用流式传输方式在|络服务器与客户端之间进行传输,式传输的实现需要合适的传输协议。IETFQInternet Engineering Task ForceQ因特网工程dl)制订的很多协议可用于实现媒体技术?
媒体实用解x?/b>
DSP以其高性能和Y件可~程{特点,长期历来Ҏ(gu)字媒体处理vCU极的推动作用。TI在DSP媒体处理技术上U篏丰富的经验,其解x案的应用范围极ؓ(f)q泛Q可以涵盖高性能视频C成本音频与媄(jing)像。随着DSP在实现SOC技术上的巨大进展,TI陆箋推出一批基于DSPQ适用于流媒体的的通用媒体处理器,q且全面支持各种的流媒体格式Q以针对不用的品应用方向?
TMS320DA180是针寚w频流的^台处理,是集成DSP和RISC处理器的双核l构Qƈh包括以太|接口在内的多种外围接口Q易于扩展WLAN。可以支持许多种音频和语韌码,适合于远E音频播攑֙和网l广播等产品?
TMS320DM270是针对媄(jing)像和视频^収ͼ不仅集成有DSP和RISC处理器的双核l构Qؓ(f)增强影像和视频处理能力,又集成有专用囑փ处理引擎iMX。该器g中还集成了CCD控制区、OSD视频~码器、媄(jing)像预览等单元。DM270支持MPEG4在VGA分L率下的实时解码,以及(qing)在CIF分L率的实时~解码,适用产品为数字媒体播攑֙和视频电(sh)话、网l相机等?
TMS320DM642 数字媒体处理器作为高端视频流q_Q将在更多的视频和媄(jing)像解x案中扮演着重要的作用。基于经业届验证的C64x DSP核心QDM642是业界当今最高性能的多媒体引擎Q具有方便地升M最新编解码软g的能力。DM642h支持VGA分L率下的单路MPEG2~码或四路MPEG2解码的能力。其有高质量、多通道、优的视频性能Q以?qing)完整的软g可编E性,可加快视频品的上市旉Q通过集成音频可视性外N低系l成本。DM642极其兼容优化器gDM641和DM640适用于VOD和IP机顶盒、数字媒体中心、数字监控系l等应用?
Z于推qDSP的流媒体解决Ҏ(gu)QTI已推出数字媒体开发套Ӟq在Z其DSP的^C展示了对H.264基本和主cd议的~解码能力。TI一直与H.264软g法开发商Q如UBVideo和Ingenient技术公司合作。该l合开发套件不仅可以视频工程师更加熟(zhn)DSPQ而且可以使DSP工程师更Ҏ(gu)开发视频系l?
众多知名的视频算法提供商如Emuzed、Escient、FedTec、iM Networks、Ingenient、Mediabolic ?Oregon Networks{,已基于TI的媒体^台开发出商用媒体方案。业界知名的嵌入式操作系l公司Accelerated Technologies、Pigeon Point Systems ?WindRiver已经能够支持TI的流媒体解决Ҏ(gu)Q?DivX、Microsoft、Quicktime 以及(qing) RealNetworks {多家公司的媒体~码译码器已UL?TI 的媒体流产品中?
以媒体处理^台支持流媒体技? q综合多U相x术,以推q低成本、高性能的解x案,是流媒体产品产业化的关键。期待着更多的媒体内容不仅由PC,而且由多U新型独L(fng)色的视频媒体l端Q通过媒体技术传送到千家万户?
媒体的发展I间
宽带入户的不断发展已使家庭网l技术成本已逐步辑ֈ消费者的心理价位。今天,有数以百万计的计机用于存储音乐文g和来自数字相机的影像。个频收录机QPVRQ和个h音频收录机(PARQ正在成为新的市场热点,q加速了媒体技术的产业化进E。更多的讑֤需要得消费者在数字家庭内外对多U媒体格式进行管理、储存、显CZ?qing)分配,便得流媒体的解x案拓展到数字?sh)视、数字媒体中心、数字机盒、小区媒体网养I以及(qing)便携式手持终端等qK的市场空间?
Forrester Research公司调查表明Q将数字家庭转变成大众市场的先决条g正逐渐形成Q客h在升U其外设Q服务供应商提供的服务项目不仅仅限于讉KQ而家庭网l设备也正开始与所有设备进行无~连接。Yankee Group公司提供的数据表明,国q?,700万个家庭拥有宽带q接Q其中有400万个家庭可经怸载完整的视频内容。流媒体技术由此而得C发展的机遇?
在中国,作ؓ(f)影响最qѝ增长最快、市场潜力最大的产业之一的互联网Q正在以出Z惌的深度和q度q速的发展。根据CNNIC的报告,截止2003q底Q中国网民数辑ֈ?950万,居世界第二位Q上|计机辑ֈ3089万台Q网l国际出口带宽L辑ֈ27216M。数字家庭消费者的愿望主要集中于对现有或新的丰富的多媒体内容进行更好的理。这U愿望ؓ(f)服务供应商、消费类?sh)子与网l设备制造商提供了重大的商机Q以便他们推Z用户可轻松访问内容的产品。因此,媒体在中国的推q势在必行?
1.1 Hibernate API 变化
1.1.1 包名
1.1.2 org.hibernate.classic?
1.1.3 Hibernate所依赖的第三方软g?
1.1.4 异常模型
1.1.5 Session接口
1.1.6 createSQLQuery()
1.1.7 Lifecycle ?Validatable 接口
1.1.8 Interceptor接口
1.1.9 UserType和CompositeUserType接口
1.1.10 FetchModec?
1.1.11 PersistentEnumc?
1.1.12 对Blob 和Clob的支?
1.1.13 Hibernate中供扩展的API的变?
1.2 元数据的变化
1.2.1 (g)索策?
1.2.2 对象标识W的映射
1.2.3 集合映射
1.2.4 DTD
1.3 查询语句的变?
1.3.1 indices()和elements()函数
管Hibernate 3.0 与Hibernate2.1的源代码是不兼容的,但是当Hibernate开发小l在设计Hibernate3.0Ӟ为简化升UHibernate版本作了周到的考虑。对于现有的ZHibernate2.1的Java目Q可以很方便的把它升U到Hibernate3.0?/p>
本文描述了Hibernate3.0版本的新变化QHibernate3.0版本的变化包括三个方面:(x)
Q?QAPI的变化,它将影响到JavaE序代码?br />Q?Q元数据Q它?yu)?jing)响到对象-关系映射文g?br />Q?QHQL查询语句?/p>
值得注意的是Q?Hibernate3.0q不?x)完全取代Hibernate2.1。在同一个应用程序中Q允许Hibernate3.0和Hibernate2.1q存?/p>
1.1 Hibernate API 变化
1.1.1 包名
Hibernate3.0的包的根路径? “org.hibernate?Q而在Hibernate2.1中ؓ(f)“net.sf.hibernate”。这一命名变化使得Hibernate2.1和Hibernate3.0能够同时在同一个应用程序中q行?/p>
如果希望把已有的应用升到Hibernate3.0Q那么升U的W一步是把Java源程序中的所有“net.sf.hibernate”替换ؓ(f)“org.hibernate”?/p>
Hibernate2.1中的“net.sf.hibernate.expression”包被改名ؓ(f)“org.hibernate.criterion”。假如应用程序用了Criteria APIQ那么在升的过E中Q必LJava源程序中的所有“net.sf.hibernate.expression”替换ؓ(f)“org.hibernate.criterion”?/p>
如果应用使用了除Hibernate以外的其他外部YӞ而这个外部Y件又引用了Hibernate的接口,那么在升U时必须十分心。例如EHCache拥有自己的CacheProviderQ?net.sf.ehcache.hibernate.ProviderQ在q个cM引用了Hibernate2.1中的接口Q在升应用Ӟ可以采用以下办法之一来升UEHCache:
Q?Q手工修改net.sf.ehcache.hibernate.Providerc,使它引用Hibernate3.0中的接口?br />Q?Q等到EHCache软g本n升Z用Hibernate3.0后,使用新的EHCache软g?br />Q?Q用Hibernate3.0中内|的CacheProviderQorg.hibernate.cache.EhCacheProvider?/p>
1.1.2 org.hibernate.classic?/p>
Hibernate3.0把一些被废弃的接口都转移到org.hibernate.classic中?/p>
1.1.3 Hibernate所依赖的第三方软g?/p>
在Hibernate3.0的Y件包的lib目录下的README.txt文g中,描述了Hibernate3.0所依赖的第三方软g包的变化?/p>
1.1.4 异常模型
在Hibernate3.0中,HibernateException异常以及(qing)它的所有子c都l承了java.lang.RuntimeException。因此在~译Ӟ~译器不?x)再(g)查HibernateException?/p>
1.1.5 Session接口
在Hibernate3.0中,原来Hibernate2.1的Session接口中的有些基本Ҏ(gu)也被废弃Q但Z化升U,q些Ҏ(gu)依然是可用的Q可以通过org.hibernate.classic.Session子接口来讉K它们Q例如:(x)
org.hibernate.classic.Session session=sessionFactory.openSession();
session.delete("delete from Customer ");
在Hibernate3.0中,org.hibernate.classic.Session接口l承了org.hibernate.Session接口Q在org.hibernate.classic.Session接口中包含了一pd被废弃的Ҏ(gu)Q如find()、interate(){。SessionFactory接口的openSession()Ҏ(gu)q回org.hibernate.classic.Sessioncd的实例。如果希望在E序中完全用Hibernate3.0Q可以采用以下方式创建Session实例Q?/p>
org.hibernate.Session session=sessionFactory.openSession();
如果是对已有的程序进行简单的升Qƈ且希望仍然调用Hibernate2.1中Session的一些接口,可以采用以下方式创徏Session实例Q?/p>
org.hibernate.classic.Session session=sessionFactory.openSession();
在Hibernate3.0中,Session接口中被废弃的方法包括:(x)
* 执行查询的方法:(x)find()、iterate()、filter()和delete(String hqlSelectQuery)
* saveOrUpdateCopy()
Hibernate3.0一律采用createQuery()Ҏ(gu)来执行所有的查询语句Q采用DELETE 查询语句来执行批量删除,采用merge()Ҏ(gu)来替?saveOrUpdateCopy()Ҏ(gu)?/p>
提示Q在Hibernate2.1中,Session的delete()Ҏ(gu)有几U重载Ş式,其中参数为HQL查询语句的delete()Ҏ(gu)在Hibernate3.0中被废弃Q而参Cؓ(f)Ojbectcd的的delete()Ҏ(gu)依然被支持。delete(Object o)Ҏ(gu)用于删除参数指定的对象,该方法支持联删除?/p>
Hibernate2.1没有Ҏ(gu)量更新和扚w删除提供很好的支持,参见<<_NHibernate>>一书的W?3章的13.1.1节(扚w更新和批量删除)Q而Hibernate3.0Ҏ(gu)量更新和扚w删除提供了支持,能够直接执行扚w更新或批量删除语句,无需把被更新或删除的对象先加载到内存中。以下是通过Hibernate3.0执行扚w更新的程序代码:(x)
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
String hqlUpdate = "update Customer set name = :newName where name = :oldName";
int updatedEntities = s.createQuery( hqlUpdate )
.setString( "newName", newName )
.setString( "oldName", oldName )
.executeUpdate();
tx.commit();
session.close();
以下是通过Hibernate3.0执行扚w删除的程序代码:(x)
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
String hqlDelete = "delete Customer where name = :oldName";
int deletedEntities = s.createQuery( hqlDelete )
.setString( "oldName", oldName )
.executeUpdate();
tx.commit();
session.close();
1.1.6 createSQLQuery()
在Hibernate3.0中,Session接口的createSQLQuery()Ҏ(gu)被废弃,被移到org.hibernate.classic.Session接口中。Hibernate3.0采用新的SQLQuery接口来完成相同的功能?/p>
1.1.7 Lifecycle ?Validatable 接口
Lifecycle和Validatable 接口被废弃,q且被移到org.hibernate.classic包中?/p>
1.1.8 Interceptor接口
在Interceptor 接口中加入了两个新的Ҏ(gu)?用户创徏的Interceptor实现cd升的过E中Q需要ؓ(f)q两个新Ҏ(gu)提供Ҏ(gu)体ؓ(f)I的实现。此外,instantiate()Ҏ(gu)的参C了修改,isUnsaved()Ҏ(gu)被改名ؓ(f)isTransient()?/p>
1.1.9 UserType和CompositeUserType接口
在UserType和CompositeUserType接口中都加入了一些新的方法,q两个接口被Udorg.hibernate.usertype包中Q用户定义的UserType和CompositeUserType实现cdd现这些新Ҏ(gu)?/p>
Hibernate3.0提供了ParameterizedType接口Q用于更好的重用用户自定义的cd?/p>
1.1.10 FetchModec?/p>
FetchMode.LAZY ?FetchMode.EAGER被废弃。取而代之的分别为FetchMode.SELECT 和FetchMode.JOIN?/p>
1.1.11 PersistentEnumc?/p>
PersistentEnum被废弃ƈ删除。已l存在的应用应该采用UserType来处理枚丄型?/p>
1.1.12 对Blob 和Clob的支?/p>
Hibernate对Blob和Clob实例q行了包装,使得那些拥有Blob或Clobcd的属性的cȝ实例可以被游R序列化或反序列化,以及(qing)传递到merge()Ҏ(gu)中?/p>
1.1.13 Hibernate中供扩展的API的变?/p>
org.hibernate.criterion?org.hibernate.mapping?org.hibernate.persister和org.hibernate.collection 包的l构和实现发生了重大的变化。多数基于Hibernate
2.1 的应用不依赖于这些包Q因此不?x)被影响。如果你的应用扩展了q些包中的类Q那么必非常小心的对受影响的程序代码进行升U?/p>
1.2 元数据的变化
1.2.1 (g)索策?/p>
在Hibernate2.1中,lazy属性的默认gؓ(f)“false”,而在Hibernate3.0中,lazy属性的默认gؓ(f)“true”。在升映射文gӞ如果原来的映文件中的有兛_素,?lt;set>?lt;class>{没有显式设|lazy属性,那么必须把它们都昑ּ的设|ؓ(f)lazy=“true”。如果觉得这U升U方式很ȝQ可以采取另一单的升方式Q在<hibernate-mapping>元素中设|? default-lazy=“false”?
1.2.2 对象标识W的映射
unsaved-value属性是可选的Q在多数情况下,Hibernate3.0把unsaved-value="0" 作ؓ(f)默认倹{?/p>
在Hibernate3.0中,当用自然主键和游离对象Ӟ不再实现Interceptor.isUnsaved()Ҏ(gu)?如果没有讄q个Ҏ(gu)Q当Hibernate3.0无法区分对象的状态时Q会(x)查询数据库,来判断这个对象到底是临时对象Q还是游d象。不q,昑ּ的用Interceptor.isUnsaved()Ҏ(gu)?x)获得更好的性能Q因可以减少Hibernate直接讉K数据库的ơ数?/p>
1.2.3 集合映射
<index>元素在某些情况下?lt;list-index>?lt;map-key>元素替代。此外,Hibernate3.0?lt;map-key-many-to-many> 元素来替代原来的<key-many-to-many>.元素Q用<composite-map-key>元素来替代原来的<composite-index>元素?/p>
1.2.4 DTD
对象-关系映射文g中的DTD文档Q由原来的:(x)
http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd
改ؓ(f)Q?br />http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd
1.3 查询语句的变?/p>
Hibernate3.0 采用新的ZANTLR的HQL/SQL查询译器,不过QHibernate2.1的查询翻译器也依然存在。在Hibernate的配|文件中Qhibernate.query.factory_class属性用来选择查询译器。例如:(x)
Q?Q选择Hibernate3.0的查询翻译器Q?br />hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory
Q?Q选择Hibernate2.1的查询翻译器
hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory
提示QANTLR是用UJava语言~写出来的一个编译工P它可生成Java语言或者是C++的词法和语法分析器,q可产生语法分析?wi)ƈ对该树(wi)进行遍历。ANTLR׃是纯Java的,因此可以安装在Q意^CQ但是需要JDK的支持?/p>
Hibernate开发小l尽力保证Hibernate3.0的查询翻译器能够支持Hibernate2.1的所有查询语句。不q,对于许多已经存在的应用,在升U过E中Q也不妨仍然使用Hibernate2.1的查询翻译器?br />值得注意的是Q?Hibernate3.0的查询翻译器存在一个BugQ不支持某些theta-styleq结查询方言Q如Oracle8i的OracleDialect方言、Sybase11Dialect。解册一问题的办法有两种Q(1Q改Z用支持ANSI-styleq结查询的方aQ如 Oracle9Dialect,Q?Q如果升U的时候遇到这一问题Q那么还是改Z用Hibernate2.1的查询翻译器?/p>
1.3.1 indices()和elements()函数
在HQL的select子句中废弃了indices()和elements()函数Q因两个函数的语法很让用戯解,可以用显式的q接查询语句来替?select elements(...) 。而在HQL的where子句中,仍然可以使用elements()函数?/p>