【武宇】
上次講解了java 5中的泛型這個(gè)比較重要的新概念,以及自動(dòng)封裝解封機制(即Integer和int自動(dòng)互相轉化),還有for each循環(huán)等java 5的新特性。今天再講講,Java5中另一個(gè)重要的特性,對整個(gè)java和J2EE體系 產(chǎn)生重要影響的元數據,或者叫做標注、注釋。英文可以叫作meta data或者Annotation。這個(gè)特性其實(shí)很簡(jiǎn)單,但卻很好用,在很多新的框架和新技術(shù)中運用廣泛如spring,EJB3.0,J2EE 5,JDBC4.0中都用到了這個(gè)特性。Annotation可以代替xml來(lái)實(shí)現例如松耦合的思想,設置實(shí)現依賴(lài)注入等技術(shù), 這樣就不用再寫(xiě)那么多復雜的xml了
首先看個(gè)例子體會(huì )一下:
在Spring1.2中寫(xiě)一個(gè)Service
@Transactional
public interface OrderService {
void createOrder(Order order);
List queryByCriteria(Order criteria);
注意@Transactional就是Annotation(標注),有了這個(gè)標注就表示這個(gè)接口里的方法都是采用默認屬性支持事務(wù)的,自己不用 再寫(xiě)begin ,commit,rollback等語(yǔ)句,當然還需要在spring中做其他配置才行,這里暫時(shí)略,大家看明白標注的意思就可以
再看一個(gè)帶參數的標注
@Transactional(readOnly=true)
interface TestService {
@Transactional(readOnly=false,rollbackFor=DuplicateOrderIdException.class)
void createOrder(Order order) throws DuplicateOrderIdException ;
List queryByCriteria(Order criteria);
}
這里
@Transactional(readOnly=true),表示這個(gè)接口里的方法都進(jìn)行只讀事務(wù)處理,
@Transactional(readOnly=false,rollbackFor=DuplicateOrderIdException.class),表示
void createOrder(Order order)方法進(jìn)行讀寫(xiě)事務(wù)處理,拋出DuplicateOrderIdException時(shí)會(huì )自動(dòng)回滾,默認時(shí)是RuntimeException回滾
這些都是spring1.2中的功能,
下面是Java EE 5中使用Annotation定義Web Service的一個(gè)例子:(引用自其他文章)
package endpoint;
import javax.jws.WebService;
@WebService
public class Hello {
public String sayHello(String param) {
return “Hello “ + param;
}
}
一個(gè)普通的Java類(lèi),通過(guò)加入@WebService這一Annotation,服務(wù)器就可將此類(lèi)中的公共方法發(fā)布為Web Service,簡(jiǎn)單又方便。
EJB3.0用使用Annotation(引自其他文章)
EJB3.0是對重載的EJB2的批判性思考和揚棄。在EJB3.0中,不再需 要EJB home接口,也不需要實(shí)現javax.ejb.SessionBean接口,一個(gè)簡(jiǎn)單的POJO對象就足于代表實(shí)體對象,并支持繼承和多態(tài)。同時(shí),困擾 人們多年的EJB部署描述符變成可選的。EJB的持久變得更加簡(jiǎn)化、輕量級,EJB的查找也變得更加簡(jiǎn)便,JNDI API不再是必須的。EJB3.0還使用了Interceptor,在業(yè)務(wù)方法被調用前進(jìn)行攔截,因而更加容易實(shí)現靈活的AOP編程。
package com.example;
@Session
public class MyEJB {
@Resource(name = “employeeDatabase”)
private DataSource myDS;
...
}
上述代碼片斷定義了名為MyEJB的Session Bean,并定義了一個(gè)名為employeeDatabase的資源,將其注入到一個(gè)名為myDS的字段。通過(guò)依賴(lài)注入,不再需要復雜的部署描述符入口,事情就這么簡(jiǎn)單。
以上舉了幾個(gè)標注在spring,Web Service,EJB3.0中的應用,大家對標注有個(gè)認識了,實(shí)際上標注(Annotation)就是在程序中加上一些說(shuō)明,這樣容器在調用這些類(lèi),方 法的時(shí)候就知道怎么處理了。(實(shí)際上是底層通過(guò)java反射機制將標注和其屬性讀取出來(lái)。)那么如何自己定義標注呢,也不復雜,我就不一一說(shuō)了,可以看下 文