﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-yuwenlin-随笔分类-JavaSE</title><link>http://www.blogjava.net/yuwenlin/category/45917.html</link><description>http://www.blogjava.net/yuwenlin/</description><language>zh-cn</language><lastBuildDate>Tue, 10 Aug 2010 09:04:51 GMT</lastBuildDate><pubDate>Tue, 10 Aug 2010 09:04:51 GMT</pubDate><ttl>60</ttl><item><title>Annotation 随记</title><link>http://www.blogjava.net/yuwenlin/archive/2010/08/10/328426.html</link><dc:creator>独孤行</dc:creator><author>独孤行</author><pubDate>Tue, 10 Aug 2010 08:47:00 GMT</pubDate><guid>http://www.blogjava.net/yuwenlin/archive/2010/08/10/328426.html</guid><wfw:comment>http://www.blogjava.net/yuwenlin/comments/328426.html</wfw:comment><comments>http://www.blogjava.net/yuwenlin/archive/2010/08/10/328426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuwenlin/comments/commentRss/328426.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuwenlin/services/trackbacks/328426.html</trackback:ping><description><![CDATA[Annotation是JavaSE5开始引入的，在Java的世界已是大行其道，各大开源框架Hibernate、Spring等都对它无缝集成，足见其份量了。。<br />
其实很早就出现在程序员的视野，只是关注的比较少：@Override、@SuppressWarnings("unchecked")，开始主要觉得没什么用处，后来公司的框架用到它，感觉还不错。。于是来一记：<br />
<br />
在网上搜Annotation的学习资料不是很多，还是用的人不多<img src="/CuteSoft_Client/CuteEditor/images/emembarrassed.gif" alt="" align="absmiddle" border="0" />，比较经典的入门就是这个：<a target="_blank" title="实战篇：设计自己的Annotation" href="http://www.javaeye.com/wiki/Annotation/385-%E5%AE%9E%E6%88%98%E7%AF%87%EF%BC%9A%E8%AE%BE%E8%AE%A1%E8%87%AA%E5%B7%B1%E7%9A%84Annotation">实战篇：设计自己的Annotation</a>，很清楚，通俗易懂，这里我就不赘述了。然而仅仅是弄懂它是怎么回事，具体还是没什么用处，这也是大多数开发人员的感觉。<br />
<br />
在现在的公司的经历两次框架升级，第一次没有用到Annotation，xml配置文件大行其道：Action跳转、Ibatis sqlmapper、Form表单(我们的表单都是从后台生成的)，整个项目xml眼花缭乱，每个模块都有自己专属的配置文件，然后集中到一起处理，而我们最痛苦的莫过于写那大量重复的配置文件。<br />
<br />
后来公司接了个ERP的单子，技术总监马上意识到框架该升级了，他技术很牛，我们公司的框架就是他一人写的，两周之后，新框架出炉，xml只保留三分之一：Action跳转、Form表单都不再使用xml配置，而是Annotation横空出世，给我的感觉：它就像一个救世主，让我们的框架重生，它就是这次升级的最大亮点，只有sqlmapper依然保留，这无可厚非，因为它原本是ibatis封装的，Action控制器既不是Struts1，Struts2，也不是Webwork，是总监自己封装的Servlet，Form表单都由后台生成js组件抛到前端，通过反编译看到源码，其实还是很基础的，贴些代码上来看下吧：<br />
<br />
1.Action请求部分：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">&nbsp;&nbsp;&nbsp; /**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;显示新增页面<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;author&nbsp;YuWenLin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;date&nbsp;2010-5-13&nbsp;上午10:31:57<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;data<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;@Action(</span><span style="color: #000000;">"</span><span style="color: #000000;">/add.shtml</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Permission(</span><span style="color: #000000;">"</span><span style="color: #000000;">client.ContractType.add</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;add(ActionData&nbsp;data){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormBuilder&nbsp;builder&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;data.getService(FormBuilder.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.append(Type.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.setAction(</span><span style="color: #000000;">"</span><span style="color: #000000;">client/contract/type/add.do</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.put(</span><span style="color: #000000;">"</span><span style="color: #000000;">script</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;builder);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">向页面抛出cookie提示信息</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageUtil.putMessage(data);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.setResulter(</span><span style="color: #000000;">"</span><span style="color: #000000;">template</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.setPath(</span><span style="color: #000000;">"</span><span style="color: #000000;">client/contract/type/type.shtml</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
可能大家看得不太明白(每个公司都有自己框架)，没有关系，就两句：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">@Action(</span><span style="color: #000000;">"</span><span style="color: #000000;">/add.shtml</span><span style="color: #000000;">"</span><span style="color: #000000;">)</span></div>
它就是负责请求显示新增的页面，就这一句，不需要像我们以前的action.xml(类似Struts2的跳转)，干净利索吧，当然底层后台有处理，但是公共的，不需我们管，至于<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">@Permission(</span><span style="color: #000000;">"</span><span style="color: #000000;">client.ContractType.add</span><span style="color: #000000;">"</span><span style="color: #000000;">)</span></div>
就是用来处理权限管理的，也是Annotation的使用，就这一句。就权限管理，后面我也会记述。。。<br />
<br />
2.再来看看@Action底层的定义：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;org.plugbase.action;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.lang.annotation.Annotation;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;Action<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;Annotation<br />
{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">abstract</span><span style="color: #000000;">&nbsp;String&nbsp;value();<br />
}<br />
</span></div>
说明下：extends Annotation跟 @interface是一样的效果，只不过前者手动extends，后者自动的。<br />
怎么样，很基础吧，跟jdk源码是一样的。。。<br />
<br />
3.JavaBean生成表单：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp; @Widget(value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">TextBox</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Valider({</span><span style="color: #000000;">"</span><span style="color: #000000;">notempty</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">len(2,8)</span><span style="color: #000000;">"</span><span style="color: #000000;">})<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
给setter方法加Annotation，@Widget是组件，@Valider是验证<br />
意思就是给name字段生成TextBox组件，并做验证处理，后台有相应的公共js组件，验证控件库调用，我们所有的表单组件都是这样生成的，说实话，这样生成一个页面真有点繁锁，既要写js，又要写后台，前端还要配，还真是有技术含量，呵呵。。。但是它保证一致性，所有表单组件，验证控件，如TextBox我们只有一套，所有人都去调用这一套，不得再重造，因为它是框架。。。<br />
<br />
4.@Widget底层定义：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.lang.annotation.Annotation;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;Widget<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;Annotation<br />
{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">abstract</span><span style="color: #000000;">&nbsp;String&nbsp;value();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">abstract</span><span style="color: #000000;">&nbsp;String&nbsp;defaultValue();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">abstract</span><span style="color: #000000;">&nbsp;String&nbsp;dataType();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">abstract</span><span style="color: #000000;">&nbsp;String&nbsp;dataSource();<br />
}<br />
</span></div>
@Valider类似，当然这些都只是定义、声明，具体怎么用，这里就不贴了，毕竟是人家东西嘛<br />
<br />
怎么样，看到这些，似乎觉得Annotation开始起作用了，其实我一直觉得，Annotation就是为xml所生，因为它们俩是死对头，不管单一地用谁，都有缺陷，<br />
只有结合才是完善，正所谓，没有最好，只有更好，合理就行。<br />
<br />
在这里我可能没有贴出什么@Annotation技术含量的东西，但是我想要表达的是一种思想，一种框架的思想，并不是什么地方都能用到Annotation，一般的中小型项目根本没必要用它，因为xml就搞定，所以用在需要用的地方，将它的能量发挥到最大。。。<br />
<br />
以上仅为一家之言，欢迎拍砖。。。<br />
<br />
<img src ="http://www.blogjava.net/yuwenlin/aggbug/328426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuwenlin/" target="_blank">独孤行</a> 2010-08-10 16:47 <a href="http://www.blogjava.net/yuwenlin/archive/2010/08/10/328426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>