国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

使用EJB3.0簡化企業(yè)級(jí)Java開發(fā),第一部分

2019-11-18 16:24:34
字體:
供稿:網(wǎng)友

  版權(quán)聲明:可以任意轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明
原文地址:
http://www.javaworld.com/javaworld/jw-08-2005/jw-0815-ejb3.Html
中文地址:
http://www.matrix.org.cn/resource/article/43/43814_EJB3_POJO.html
關(guān)鍵詞: EJB3 POJO

概述
在接下來的兩篇文章中,你將會(huì)學(xué)到使用EJB3.0中的POJO編程模型來開發(fā)更簡單,更強(qiáng)壯的企業(yè)級(jí)Java應(yīng)用。可運(yùn)行的示例代碼演示了EJB 3.0中的關(guān)鍵元素。第一部分,Michael Juntao Yuan(譯注:邁克爾.袁俊濤 華裔?中國人?)將闡述如何使用EJB 3.0 注釋來開發(fā)藕合松散的POJO應(yīng)用及容器服務(wù)器如何管理POJO.(2500字;2005年8月15日)
邁克爾.袁俊濤

————————————————————————————————————————————

Java企業(yè)級(jí)版本,或者說Java EE(以前叫J2EE),對(duì)于開發(fā)服務(wù)器端的應(yīng)用來說是一個(gè)強(qiáng)大的但卻又過于復(fù)雜的的平臺(tái)。從它誕生之日起,過于復(fù)雜一直是對(duì)使用Java EE猶豫不決的一個(gè)重要因素。在JavaWorld的以前的一篇文章”簡化之路”中,我指出了那些讓Java EE應(yīng)用變復(fù)雜的因素,其中很多都是與當(dāng)前的EJB 2.1規(guī)范有關(guān)。

在過去的三年中,Java開放源代碼社區(qū),Java社區(qū)進(jìn)程(JCP)以及主要的Java EE供應(yīng)商,一直致力于讓Java EE更簡單。舉例來說:新的設(shè)計(jì)范例,比如POJO服務(wù),服務(wù)攔截器和依賴注入,已經(jīng)可以在實(shí)際應(yīng)用中用來簡化Java EE的開發(fā)了。還有,新的工具和框架,比如Hibernate, AOP(aspect-oriented PRogramming,面向方面編程),Struts,Xdoclet和Spring, 也已經(jīng)被廣泛用于同一目的。

簡化不是功能的減少

簡化一個(gè)編程模型并沒有減少它的功能。簡化只是把復(fù)雜的邏輯隱藏到了框架代碼或可重用的組件中去了。根本上,它是把復(fù)雜的東西從需要應(yīng)用開發(fā)者直接管理的地方轉(zhuǎn)移到了大多數(shù)開發(fā)者看不到的地方。


上述的模板和工具讓初學(xué)者更容易上手,同時(shí)也提高了有經(jīng)驗(yàn)的Java開發(fā)者的生產(chǎn)力,現(xiàn)在它們正在被JCP合并到下一代的Java EE標(biāo)準(zhǔn)中(比如:EJB 3.0)。由Java開發(fā)人員Raghu Kodali最近所做的研究顯示:將Java EE的示例程序RosterApp從EJB 2.1轉(zhuǎn)到EJB 3.0可以減少百分之五十以上的代碼。

Java注釋是EJB3.0背后的關(guān)鍵,它將POJO服務(wù),POJO持久化和依賴注入一起綁定為一個(gè)完整的企業(yè)級(jí)中間件解決方案。這篇文章中,我使用了一個(gè)示例應(yīng)用:JBoss EJB 3.0 TrailBlazer,來演示使用注釋開發(fā)輕量級(jí)的EJB 3.0 POJO應(yīng)用。TrailBlazer的應(yīng)用使用EJB 3.0中不同的工具和API重復(fù)實(shí)現(xiàn)了一個(gè)投資計(jì)算器。示例程序完全可以在JBoss 應(yīng)用服務(wù)器4.0.3版本中運(yùn)行,并且與最新的EJB 3.0標(biāo)準(zhǔn)完全兼容(完成時(shí))。

讓我們來開始體驗(yàn)一下注釋驅(qū)動(dòng)編程模型的好處吧。

EJB 3.0的注釋驅(qū)動(dòng)編程模型

從開發(fā)者的觀點(diǎn)來看,EJB 3.0廣泛地使用了Java 注釋.注釋有兩個(gè)關(guān)鍵優(yōu)勢:它們?nèi)〈诉^多的xml配置文件并且消除了嚴(yán)格組件模型需求。

注釋 vs XML

基于XML的布署描述和注釋一起都可以用來在Java EE應(yīng)用中配置服務(wù)的相關(guān)屬性。它們的區(qū)別在于:XML文檔是與代碼分開處理的,特別是在運(yùn)行時(shí)刻,而注釋是與代碼編譯在一起的并被編譯器檢查的。對(duì)于開發(fā)者來說這就有了一些重要的含義,正如我下面所列出的:

o冗長:XML配置文件是出了名的冗長的。為了配置代碼,XML文件必須復(fù)制許多信息:比如代碼中類名字和方法名字。Java注釋則不同,它是代碼的一部分,不需要額外的引用就可以指明配置信息。
o強(qiáng)壯性:在XML文件中重復(fù)的代碼信息引入了多處出錯(cuò)的可能。比如,如果你寫錯(cuò)了方法的名字,那應(yīng)用直到運(yùn)行時(shí)刻才會(huì)出錯(cuò)垮掉。也就是說,XML配置文件的強(qiáng)壯性就不如注釋,注釋是被編譯器檢查的,并和其它代碼一起被處理的。
o靈活性:既然XML文件是在代碼之外被單獨(dú)處理的,那也就是說基于XML的配置信息不是“硬編碼”的,是可以以后修改的。部署的靈活性對(duì)系統(tǒng)管理員來說是非常非常重要的特性。

注釋是簡單易用的,已證明對(duì)大多數(shù)應(yīng)用來說足夠了。XML文件更復(fù)雜,但能被用來處理更高級(jí)的問題。EJB 3.0允許你通過注釋來配置大多數(shù)的應(yīng)用。EJB 3.0也支持用XML文件來覆蓋默認(rèn)的注釋,及配置像數(shù)據(jù)庫聯(lián)接這樣的外部資源。
除了替換和簡化XML描述符,注釋也允許我們廢除困擾EJB 1.x, EJB 2.x的嚴(yán)格組件模型。

pojo vs 嚴(yán)格組件
EJB 組件是容器管理(container-managed)的對(duì)象。容器在運(yùn)行時(shí)刻操作Bean的狀態(tài)和行為。為了讓行為發(fā)生,EJB 2.1規(guī)范定義了一個(gè)Bean必須遵守的嚴(yán)格的組件模型。
每一個(gè)EJB類必須從某一種抽象類中繼承,并為容器提供了回調(diào)的鉤子。既然Java只支持單繼承,嚴(yán)格組件模型就限制了開發(fā)者使用EJB組件創(chuàng)建一個(gè)復(fù)雜對(duì)象結(jié)構(gòu)的能力。當(dāng)把復(fù)雜的應(yīng)用數(shù)據(jù)映射到實(shí)體 Bean中的時(shí)候,正如我們?cè)诘诙糠种锌吹降模@會(huì)成為一個(gè)很大的問題。

在EJB 3.0中,所有的容器服務(wù)都可以通過使用注釋的POJO應(yīng)用來配置和交付。大多數(shù)情況下,并不需要特殊的組件類。讓我們通過JBoss EJB 3.0 TrailBlazer示例看一下如何在EJB 3.0中使用注釋。

開發(fā)藕合松散的服務(wù)對(duì)象

像Java EE這樣的企業(yè)級(jí)中間件的一個(gè)最重要的好處是允許開發(fā)者使用藕合松散的組件來開發(fā)應(yīng)用。這些組件僅僅通過他們自己發(fā)布的商業(yè)接口來藕合。因此這些組件的實(shí)現(xiàn)類可以在不改變應(yīng)用其余部分的情況下改變自己的實(shí)現(xiàn)。這將會(huì)使應(yīng)用更加強(qiáng)壯,更容易測試,更易移植。EJB 3.0使得在POJO中創(chuàng)建藕合松散的商業(yè)組件變得更簡單了。

session bean
在EJB 3.0應(yīng)用中,藕合松散的服務(wù)組件的典型應(yīng)用是Session Bean。一個(gè)Session Bean至少有一個(gè)接口(也就是:商業(yè)接口),其它應(yīng)用組件通過它獲得服務(wù)。下面的代碼為我們的投資計(jì)算器服務(wù)提供了商業(yè)接口。它只有一個(gè)方法,根據(jù)給定的起始年齡,終止年齡,增長率,月存金額,計(jì)算出總投資額。
public interface Calculator {

  public double calculate (int start, int end,
                double growthrate, double saving);

}


Session bean類簡單地實(shí)現(xiàn)了商業(yè)接口。你必須通過使用Stateless或Stateful注釋來告訴EJB 3.0容器這個(gè)POJO類是一個(gè)Session Bean。有狀態(tài)(Stateful)的session bean在不同的服務(wù)請(qǐng)求間維護(hù)著客戶的狀態(tài)。相反地,對(duì)于無狀態(tài)(Stateless)的session bean,每次的請(qǐng)求都是被隨機(jī)挑選的session bean實(shí)例處理的。這些行為是與EJB 2.1規(guī)范中的有狀態(tài)和無狀態(tài)session bean的定義是一致的。EJB 3.0容器算出何時(shí)實(shí)例化Bean對(duì)象,并通過商業(yè)接口讓其可用。下面是session bean實(shí)現(xiàn)類的代碼:

@Stateless
public class CalculatorBean implements Calculator {

  public double calculate (int start, int end,
                    double growthrate, double saving) {
    double tmp = Math.pow(1. + growthrate / 12.,
                          12. * (end - start) + 1);
    return saving * 12. * (tmp - 1) / growthrate;
  }

}


你也可以為一個(gè)session bean指明多個(gè)接口-一個(gè)為本地客戶服務(wù),一個(gè)為遠(yuǎn)程客戶服務(wù)。只要使用@Local和@Remote注釋來區(qū)分。下面的代碼片斷顯示了同時(shí)實(shí)現(xiàn)了本地和遠(yuǎn)程接口的CalculatorBean。如果你沒有@Local和@Remote注釋,session bean接口默認(rèn)為本地接口。

@Stateless
@Local ({Calculator.class})
@Remote ({RemoteCalculator.class})
public class CalculatorBean implements Calculator, RemoteCalculator {

  public double calculate (int start, int end,
                           double growthrate, double saving) {
    double tmp = Math.pow(1. + growthrate / 12., 12. * (end - start) + 1);
    return saving * 12. * (tmp - 1) / growthrate;
  }

  public String getServerInfo () {
    return "This is the JBoss EJB 3.0 TrailBlazer";
  }
}


Session bean用戶通過JNDI得到bean的一個(gè)存根(Stub)對(duì)象。
容器所提供的存根對(duì)象實(shí)現(xiàn)了session bean的商業(yè)接口。所有針對(duì)存根的調(diào)用都被引向了容器,由容器調(diào)用相應(yīng)的實(shí)現(xiàn)類中的接口。對(duì)于有狀態(tài)的的session bean,你必須自己在客戶端緩存存根對(duì)象,這樣在每次的后續(xù)調(diào)用時(shí),容器才知道要提供相同的的bean實(shí)例。下面的片斷顯示如何調(diào)用session bean.在后面,你將會(huì)學(xué)到獲取存根對(duì)象的更簡單的方法。

InitialContext ctx = new InitialContext();
cal = (Calculator) ctx.lookup(Calculator.class.getName());

double res = cal.calculate(start, end, growthrate, saving);


session bean生命周期的管理

為達(dá)到藕合松散的目的,應(yīng)用把session bean實(shí)例的創(chuàng)建、緩存、銷毀全部交給EJB 3.0容器(也就是,反向控制設(shè)計(jì)模式)。應(yīng)用只和bean的商業(yè)接口打交道。

但如果應(yīng)用需要對(duì)session對(duì)象更好的控制呢?比如說,應(yīng)用可能需要在創(chuàng)建session bean的時(shí)候初始化數(shù)據(jù)庫聯(lián)接,而在銷毀bean時(shí)關(guān)閉外部的聯(lián)接。上述這些,你都可能通過在bean類中定義生命周期的回調(diào)方法來實(shí)現(xiàn)。這些方法將會(huì)被容器在生命周期的不同階段調(diào)用(如:創(chuàng)建或銷毀時(shí))。通過使有下面所列的注釋,EJB 3.0允許你將任何方法指定為回調(diào)方法。這不同于EJB 2.1,EJB 2.1中,所有的回調(diào)方法必須實(shí)現(xiàn),即使這是空的。EJB 3.0中,bean可以有任意數(shù)量,任意名字的回調(diào)方法。

o@PostConstrUCt:當(dāng)bean對(duì)象完成實(shí)例化后,使用了這個(gè)注釋的方法會(huì)被立即調(diào)用。這個(gè)注釋同時(shí)適用于有狀態(tài)和無狀態(tài)的session bean。
o@PreDestroy:使用這個(gè)注釋的方法會(huì)在容器從它的對(duì)象池中銷毀一個(gè)無用的或者過期的bean實(shí)例這前調(diào)用。同時(shí)適用于有狀態(tài)和無狀態(tài)的session bean.
o@PrePassivate:當(dāng)一個(gè)有狀態(tài)的session bean實(shí)例空閑過長的時(shí)間,容器將會(huì)鈍化它,并把它的狀態(tài)保存下來。使用這個(gè)注釋的方法會(huì)在容器鈍化bean實(shí)例之前調(diào)用。適用于有狀態(tài)session bean。
o@PostActivate:當(dāng)客戶端再次使用已經(jīng)被鈍化的的有狀態(tài)session bean時(shí),新的實(shí)例被創(chuàng)建,狀態(tài)被恢復(fù)。使用此注釋的session bean會(huì)在bean的激活完成時(shí)調(diào)用。
o@Init:這個(gè)注釋指定了有狀態(tài)session bean初始化的方法。它區(qū)別于@PostConstruct注釋在于:多個(gè)@Init注釋方法可以同時(shí)存在于有狀態(tài)session bean 中,但每個(gè)bean實(shí)例只會(huì)有一個(gè)@Init注釋的方法會(huì)被調(diào)用。這取決于bean是如何創(chuàng)建的(細(xì)節(jié)請(qǐng)看EJB 3.0規(guī)范)。@PostConstruct在@Init之后被調(diào)用。

另一個(gè)有用的生命周期方法注釋是@Remove,特別是對(duì)于有狀態(tài)session bean。當(dāng)應(yīng)用通過存根對(duì)象調(diào)用使用了@Remove注釋的方法時(shí),容器就知道在該方法執(zhí)行完畢后,要把bean實(shí)例從對(duì)象池中移走。

@Stateful
public class CalculatorBean implements Calculator, Serializable {

    // ... ...
    
    @PostConstruct
    public void initialize () {
        // Initializes the history records and load
        // necessary data from database etc.
// 初始化歷史記錄,并從數(shù)據(jù)庫中裝入必需的數(shù)據(jù)。
    }  
    
    @PreDestroy
    public void exit () {
        // Save history records into database if necessary.
// 如有必要?jiǎng)t將歷史記錄保存至數(shù)據(jù)庫中
    }  
    
    @Remove
    public void stopSession () {
        // Call to this method signals the container
        // to remove this bean instance and terminates
        // the session. The method body can be empty.
// 調(diào)用這個(gè)方法來通知容器將bean實(shí)例移除并中止session.
// 這個(gè)方法可以為空。
    }
    
    // ... ...
}


消息驅(qū)動(dòng)bean
Session bean服務(wù)提供了同步調(diào)用的方法。
另一個(gè)重要的藕合松散服務(wù)類型是一種通過進(jìn)入的消息來觸發(fā)的異步服務(wù)(比如:email或Java消息服務(wù)產(chǎn)生的消息)。EJB 3.0的消息驅(qū)動(dòng)bean(MDB)是設(shè)計(jì)用來專門處理基于消息請(qǐng)求的組件。

一個(gè)MDB類必須實(shí)現(xiàn)MessageListener接口。當(dāng)容器檢測到bean守候的隊(duì)列一條消息時(shí),就調(diào)用onMessage()方法,將消息作為參數(shù)傳入。MDB在OnMessage()中決定如何處理該消息。你可以用注釋來配置MDB偵聽哪一條隊(duì)列。當(dāng)MDB部署時(shí),容器將會(huì)用到其中的注釋信息。在下面的例子中,CalculatorBean MDB會(huì)在JMS隊(duì)列queue/mdb有消息進(jìn)入時(shí)調(diào)用。MDB解析消息,并根據(jù)消息內(nèi)容計(jì)算投資。

@MessageDriven(activateConfig =
{
  @ActivationConfigProperty(propertyName="destinationType",
    propertyValue="javax.jms.Queue"),
  @ActivationConfigProperty(propertyName="destination",
    propertyValue="queue/mdb")
})
public class CalculatorBean implements MessageListener {

  public void onMessage (Message msg) {
    try {
      TextMessage tmsg = (TextMessage) msg;
      Timestamp sent =
          new Timestamp(tmsg.getLongProperty("sent"));
      StringTokenizer st =
          new StringTokenizer(tmsg.getText(), ",");

      int start = Integer.parseInt(st.nextToken());
      int end = Integer.parseInt(st.nextToken());
      double growthrate = Double.parseDouble(st.nextToken());
      double saving = Double.parseDouble(st.nextToken());

      double result =
          calculate (start, end, growthrate, saving);
      RecordManager.addRecord (sent, result);

    } catch (Exception e) {
      e.printStackTrace ();
    }
  }

  // ... ...
}


依賴注入

在上一節(jié)中,你學(xué)到了如何開發(fā)藕合松散的服務(wù)組件。但是,為了存取那些服務(wù)對(duì)象,你需要通過服務(wù)器的JNDI來查找存根對(duì)象(session bean)或消息隊(duì)列(MDB)。JNDI查找是把客戶端與實(shí)際的服務(wù)端實(shí)現(xiàn)解藕的關(guān)鍵步驟。但是,直接使用一個(gè)字符串來進(jìn)行JNDI查找并不優(yōu)雅。有這樣幾個(gè)原因:

o客戶端與服務(wù)端必須有一致的基于字符串的名字。它沒有在編譯時(shí)得到認(rèn)證或在布署時(shí)得到檢查。
o從JNDI返回的服務(wù)對(duì)象的類型沒有在編譯時(shí)進(jìn)行檢查,有可能在運(yùn)行時(shí)出現(xiàn)轉(zhuǎn)換(casting)錯(cuò)誤。
o冗長的查找代碼,有著自己的try-catch代碼塊,在應(yīng)用之間是重復(fù)的和雜亂的
EJB 3.0,對(duì)任何POJO,提供了一個(gè)簡單的和優(yōu)雅的方法來解藕服務(wù)對(duì)象和資源。使用@EJB注釋,你可以將EJB存根對(duì)象注入到任何EJB 3.0容器管理的POJO中。如果注釋用在一個(gè)屬性變量上,容器將會(huì)在它被第一次訪問之前賦值給它正確的值。下面的例了演示了怎樣把CalculatorBean無狀態(tài)session bean的存根注入到CalculatorMDB MDB類中。

public class CalculatorMDB implements MessageListener {

  @EJB Calculator cal;
  
  // Use the cal variable
  // ... ...
}


注釋如果被用在JavaBean風(fēng)格的setter方法上時(shí),容器會(huì)在屬性第一次使用之前,自動(dòng)地用正確的參數(shù)調(diào)用bean的setter方法。下面的片斷演示了這是如何做的:

public class CalculatorMDB implements MessageListener {

  Calculator cal;
  
  @EJB
  public void setCal (Calculator cal) {
    this.cal = cal;
  }
  
  // Use the cal variable
// 使用cal變量
  // ... ...
}


除@EJB注釋之外,EJB 3.0也支持@Resource注釋來注入來自JNDI的任何資源。
下面的例子中,我演示了如何注入服務(wù)器端默入的TimerService和SessionContext對(duì)象,也演示了如何注入來自JNDI的命名數(shù)據(jù)庫和JMS資源。

@Resource
TimerService tms;

@Resource
SessionContext ctx;

@Resource (name="DefaultDS")
DataSource myDb;

@Resource (name="ConnectionFactory")
QueueConnectionFactory factory;

@Resource (name="queue/A")
Queue queue;


此外,你也可以把一個(gè)容器管理的持久化管理器(也就是,EntityManager-類似于Hibernate session對(duì)象)注入到EJB 3.0 POJO中。

把容器服務(wù)交給POJO

除了管理生命周期和訪問藕合松散的服務(wù)對(duì)象外,EJB 3.0通過簡單的注釋也為POJO提供了運(yùn)行時(shí)刻服務(wù)。

事務(wù)

最有用的容器服務(wù)可能就是事務(wù)管理服務(wù),當(dāng)應(yīng)用出現(xiàn)失敗或異常時(shí),它保證了數(shù)據(jù)庫的完整性。你可以簡單地將為一個(gè)POJO方法申明它的事務(wù)屬性。這樣容器就可以在合適的上下文中運(yùn)行這個(gè)方法。舉例來說,下面的代碼申明了容器在運(yùn)行updateExchangeRate()時(shí)必須創(chuàng)建一個(gè)新的事務(wù)。當(dāng)這個(gè)方法退出時(shí)提交事務(wù)。實(shí)際上,所有在updateExchangeRate()中被調(diào)用的方法都在此事務(wù)中運(yùn)行,除非有特別申明。在updateExchangeRate()中的數(shù)據(jù)庫操作要么全部成功,要么全部失敗。

@Stateless
public class CalculatorBean implements Calculator {

  // ... ...

  @TransactionAttribute(TransactionAttributeType.REQUIRED)
  public void updateExchangeRate (double newrate) throws Exception {
    // Update the database in a loop.
// 在循環(huán)中更新數(shù)據(jù)庫
    // ... ...
    // The Operations in the loop must all be successful or
    // the database is not updated at all.
// 循環(huán)中的操作必須全部成功或者根本不更新。
  }
}


安全
容器也提供了安全服務(wù)來進(jìn)行用戶認(rèn)證和根據(jù)用戶規(guī)則來限制對(duì)POJO的訪問。對(duì)每一個(gè)POJO來說,你可以通過使用@SecurityDomain注釋為它指定一個(gè)安全域, 安全域告訴容器到哪里去找密碼和用戶角色列表。JBoss中的other域表明文件是classpath中的users.propertes和roles.properties。這樣,對(duì)每一個(gè)方法來說,我們可以使用一個(gè)安全限制注釋來指定誰可以運(yùn)行這個(gè)方法。比如,下面的例子,容器對(duì)所有試圖調(diào)用addFund()的用戶進(jìn)行認(rèn)證,只允許擁有AdminUser角色的用戶實(shí)際運(yùn)行它。如果你沒有登錄或者沒有以管理員的身份登錄,一個(gè)安全意外將會(huì)拋出。

@Stateless
@SecurityDomain("other")
public class CalculatorBean implements Calculator {

  @RolesAllowed({"AdminUser"})
  public void addFund (String name, double growthrate) {
    // ... ...
  }

  @RolesAllowed({"AdminUser"})
  public void addInvestor (String name, int start, int end) {
    // ... ...
  }

  @PermitAll
  public Collection <Fund> getFunds () {
    // ... ...
  }
  
  // ... ...

  @RolesAllowed({"RegularUser"})
  public double calculate (int fundId, int investorId,
                                       double saving) {
    // ... ...
  }
}


通用攔截器
事務(wù)和安全服務(wù)都可以被看作是容器管理的運(yùn)行時(shí)刻攔截器。
容器攔截了對(duì)EJB存根的調(diào)用,并在其上應(yīng)用事務(wù)上下文或進(jìn)行安全限制。

在EJB 3.0中,你可以自己寫攔截器來擴(kuò)展容器服務(wù)。使用@AroundInvoke注釋,你可以將任意bean方法作為攔截器方法在任意bean方法之前和之后運(yùn)行。下面的例子中,log()方法是一個(gè)攔截器,它計(jì)算和記錄了其它bean方法的執(zhí)行時(shí)間:

@Stateful
public class CalculatorBean implements Calculator {

  // Bean methods that are to be intercepted by "log()"
  // bean方法將被log()方法攔截
//
  // ... ...
  
  @AroundInvoke
  public Object log (InvocationContext ctx)
                            throws Exception {

    String className = ctx.getBean().getClass().getName();
    String methodName = ctx.getMethod().getName();
    String target = className + "." + methodName + "()";

    long start = System.currentTimeMillis();
    System.out.println ("Invoking " + target);
    try {
      return ctx.proceed();
    } catch(Exception e) {
      throw e;
    } finally {
      System.out.println("Exiting " + target);

      cal.setTrace(cal.getTrace() + "
" +
                   "Exiting " + target);
      long time = System.currentTimeMillis() - start;
      System.out.println("This method takes " +
                          time + "ms to execute");
    }
  }
}


下一步?
在第一部分中,我大致地討論了EJB 3.0基于POJO的編程模型和如何在EJB 3.0中開發(fā)藕合松散的服務(wù)組件。在第二部分中,我會(huì)討論EJB 3.0的另一個(gè)主要的概念:可管理的POJO持久性。

關(guān)于作者
邁克爾.袁博士為JBoss工作。他特別擅長端到端的企業(yè)級(jí)解決方案。他是三本書的作者:Nokia Smartphone Hacks, Enterprise J2ME, 和 Nokia Series: Developing Scalable Series 40 applications。袁獲得了位于Austin的得克薩斯大學(xué)得到博士學(xué)位。

相關(guān)資源
oJBoss EJB 3.0 TrailBlazer應(yīng)用是這篇文章范例所用的程序。你可以在線研究或從以下地址下載:http://www.jboss.com/docs/trailblazer
o“EJB 3.0的簡易性”Raghu R.Kodali(Java 開發(fā)者雜志, 2005年8月)

下面是與這篇文章中所涉及內(nèi)容相關(guān)的學(xué)習(xí)資源列表:
o無狀態(tài) session beans:
http://trailblazer.demo.jboss.com/EJB3Trail/serviceobjects/slsb/index.html
o有狀態(tài) session beans:
http://trailblazer.demo.jboss.com/EJB3Trail/serviceobjects/sfsb/index.html
oSession bean 生命周期內(nèi)的回調(diào):
http://trailblazer.demo.jboss.com/EJB3Trail/serviceobjects/lifecycle/index.html
o消息驅(qū)動(dòng) beans:
http://trailblazer.demo.jboss.com/EJB3Trail/serviceobjects/mdb/index.html
oJBoss消息驅(qū)動(dòng) POJOs:
http://trailblazer.demo.jboss.com/EJB3Trail/serviceobjects/mdpojo/index.html
o針對(duì)服務(wù)端對(duì)象的依賴注入:
http://trailblazer.demo.jboss.com/EJB3Trail/serviceobjects/injection/index.html
o事務(wù)服務(wù):
http://trailblazer.demo.jboss.com/EJB3Trail/services/transaction/index.html
o安全服務(wù):
http://trailblazer.demo.jboss.com/EJB3Trail/services/security/index.html
o攔截器:
http://trailblazer.demo.jboss.com/EJB3Trail/services/interceptor/index.html
o這些范例運(yùn)行在JBoss 應(yīng)用服務(wù)器的4.0.3版本中。
下面是下載和安裝說明:
http://trailblazer.demo.jboss.com/EJB3Trail/background/install/index.html
o邁克爾.袁早一些在JavaWorld上的的文章 “簡化之路”(2005年2月)闡述了與較老的EJB 2.1對(duì)比,POJO編程模型的優(yōu)勢:
http://www.javaworld.com/javaworld/jw-02-2005/jw-0221-jboss4.html
oAnil Sharma所寫的“EJB 3.0技術(shù)手冊(cè)”(JavaWorld,2004年8月)是一個(gè)對(duì)早期版本的EJB 3.0規(guī)范的分析。它為我們提供了對(duì)于范規(guī)后面的基本原理的認(rèn)識(shí):
http://www.javaworld.com/javaworld/jw-08-2004/jw-0809-ejb.html
o邁克爾.袁也進(jìn)行無線領(lǐng)域的開發(fā)。請(qǐng)查看他過去在JavaWorld的無線Java專欄中的文章:
http://www.javaworld.com/columns/jw-wireless-index.shtml
o查看更多的有關(guān)Java EE的文章,請(qǐng)瀏覽在JavaWorld的頂層索引中的Java 2 Platform, Enterprise Edition (J2EE) 部分:
http://www.javaworld.com/channel_content/jw-j2ee-index.shtml?

(出處:http://m.survivalescaperooms.com)



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安多县| 瑞昌市| 武平县| 广州市| 海南省| 连江县| 清流县| 山阳县| 靖宇县| 沅陵县| 丹寨县| 崇左市| 宜宾县| 自治县| 高阳县| 乌兰浩特市| 同德县| 菏泽市| 峨山| 通山县| 汤原县| 南投市| 全椒县| 油尖旺区| 泰来县| 威远县| 额敏县| 龙泉市| 桂平市| 马边| 五峰| 平远县| 惠东县| 勃利县| 温泉县| 丽水市| 柘城县| 页游| 安吉县| 贵南县| 石阡县|