Tiger出籠以后, Annotation成了一個(gè)小小的亮點(diǎn),雖然有抄襲.net之嫌疑,畢竟讓Java開(kāi)發(fā)者方便了許多。EJB3.0和Hibernate Annotation版都是基于這個(gè)東西了。
下面是結(jié)合Spring的自動(dòng)Log/鑒權(quán)/國(guó)際化應(yīng)用: public interface SessionService extends Service { @Anonymous //允許未登錄用戶調(diào)用 @OperationLog //自動(dòng)log @Name(zh = "登錄") public String login( @Name(en="user",zh = "用戶")String user, @OperationLog(false)String password); //不log密碼 @OperationLog @Name(zh="注銷") public void logout(); @Anonymous用于鑒權(quán),允許匿名訪問(wèn)。通過(guò)ThreadLocal的變量保存當(dāng)前用戶的Session信息。 @OperationLog 用于標(biāo)記是否自動(dòng)Log, 可以作用于類、方法、參數(shù) @Name 用于i18n國(guó)際化支持。Java里面常見(jiàn)的國(guó)際化解決方法是.properties文件,個(gè)人認(rèn)為這個(gè)方案不好,適合大型項(xiàng)目開(kāi)發(fā)。小項(xiàng)目中這個(gè)標(biāo)記一 下足矣。如果要添加一種語(yǔ)言,只要在@Name中多一個(gè)參數(shù),利用Eclipse的reference很容易知道有哪些地方要翻譯。 同樣@Name還可以加在Bean上,自動(dòng)構(gòu)造多語(yǔ)言的Table/List,方便之極。 @Name(zh="安全事件",en="Security Event")
public class SecurityEvent extends AbstractEmsEvent{ String cause; @Name(zh="原因") public String getCause() { return cause; } } 附上我的I18nUtil工具類: /**
* @author steeven */ public class I18nUtil { public static String getName(Method method) { return getI18n(method,Name.class); } public static String getTip(Method method) { return getI18n(method,Tip.class); } public static String getI18n(Method method,Class<? extends Annotation> i18nClass) { Annotation i18n = method.getAnnotation(i18nClass); return getProperty(i18n,method.getName()); } public static String getProperty(Annotation i18n, String defaultValue) { if (i18n==null) return defaultValue; Class<? extends Annotation> clz = i18n.annotationType(); try { Method method = clz.getMethod(getI18nMethodName()); assert method!=null; String r = (String) method.invoke(i18n); return r==null || r.length()==0?defaultValue:r; } catch (Exception e) { assert false; return defaultValue; } } private static String getI18nMethodName() { return Locale.getDefault().getLanguage(); } @SuppressWarnings("unchecked") public static <T extends Annotation> T getAnnotation(Annotation[] argAnnotations, Class<T> clz) { for(Annotation anno:argAnnotations) if (clz.isInstance(anno)) return (T) anno; return null; } } 元數(shù)據(jù)的結(jié)構(gòu)似乎有些簡(jiǎn)單,有時(shí)候要加很多@Name,@Tip,@Help好像沒(méi)辦法一個(gè)Tag搞定。 另外,還可以通過(guò)Annotation加上驗(yàn)證、輸入界面描述,等等。程序很容易自動(dòng)化,再多的畫(huà)面也用不了多少代碼。 Jdk5.0提供了這么好用的原數(shù)據(jù)機(jī)制,你有什么好的用法呢? |
|
來(lái)自: zybingliu > 《annotation》