EJB 3用到相當大量的annotation,初時看了Pro EJB3看了半天看不太懂,後來終於大概了解一些了,要先懂annotation。
annotation用於修飾後面的宣告,如類別、成員變數與方法,當然還有其他用法,要先記得@annotation只修飾後面接的描述。
EJB 3用到annotation要分修飾EJB本身與內部,以及修飾資源兩塊。
 
EJB本身與內部
古代的EJB分作Session Bean、Entity Bean以及後來加入的Message Driven Bean,其中Session Bean又分Stateless與Stateful。指定為EJB時都要在類別前宣告,每種EJB各有自己使用method的annotation,以下整理不盡完整。
 
1. Stateless Session Bean:用完即被EJB Container釋出資源。
@Stateless   // javax.ejb.Stateless
public class StatelessSessionBean implements SomeService {
  @PostConstruct                 // import javax.annotation.PostConstruct;
  public void init() {...}        // 取代建構子,由EJB Container call back
  @PreConstruct                  // import javax.annotation.PreConstruct;
  public void destroy() {...} // 取代解構子,由EJB Container call back
}
 
2. Stateful Session Bean:會被EJB Container持續keep在context內,除非被@Remove
@Stateful   // import javax.ejb.Stateful
public class StatefulSessionBean implements SomeService {
  @Remove                         // import javax.ejb.Remove
  public void cancel() {...}   // 當客戶端呼叫cancel,該instance會被EJB Container自context移除。
  @PrePassivate                   // import javax.ejb.PrePassivate
  public void die() {...}        // 鈍化,可序列化離線儲存並被cluster複製,通常放置如release connection的動作。
  @PostActivate                  // import javax.ejb.PostActivate
  public void active() {...}   // 活化,可反序列已鈍化的bean,也通常放置取得connection的動作。
}
 
3. 遠端介面
@Remote                                       // import javax.ejb.Remote
public interface SomeService {...}  // 不指明@Remote的介面預設為@Local
 
4. Message Driven Bean
以下Sample應該是先取得配置內容再修改下面的Bean
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
 
@MessageDriven(
    mappedName="destinationQueue",
    activationConfig = {
        @ActivationConfigProperty(propertyName="destinationType",
                                  propertyValue="javax.jms.Queue"),
        @ActivationConfigProperty(propertyName="messageSelector",
                                  propertyValue="RECIPIENT='ReportProcessor'")
})
public class ReportProcessorBean implements javax.jms.MessageListener {
    public void onMessage(javax.jms.Message message) {
        System.out.println("Processing message: " + message.toString());
    }
}
 
5. Entity Bean則由JPA取代,見JPA初體驗用法:
@Entity    // import javax.persistence.Entity
@Table(name="MyEmp")   // 若Table Name是Employee不需指定, JPA的Entity會預設類別名為Table名
public class Employee {
  @Id  // javax.persistence.Id
  private int id;
}
 
資源修飾
1. @EJB 聲明某個EJB import javax.ejb.EJB,有以下用法的變形:
(1) 置於類別上
@EJB(name="audit", beanInterface="AuditService.class")
public class DeptServiceBean {
  AuditService audit;   // 對映到name="audit"
}
(2) 在成員變數之前
@EJB AuditService audit;
(3) 用於方法之前
  private AuditService audit;  // 私有變數
  @EJB
  public void setAuditService (AuditService audit) {
    this.audit = audit;
  }
 
2. @Resource 可替代JNDI用法
@Resource(name=“jdbc/myDataSource")
private DataSource defaultDataSource;   // 這時不可再賦值
 
3. 修飾EntityManager
@PersistenceContext(unitName="EmployeeService")
EntityManager em;

4. 修飾EntityManagerFactory
@PersistentUnit(unitName="EmployeeService")
EntityManagerFactory emf;
 
還有像Transaction的annotation,可是覺得越多越煩,而且也是受Spring IoC的影響,EJB 3提供了開發的方便性,也產生了選擇多樣化上的不便性,這是在組合成開發上專用Framework時必要考量。
 
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Jemmy 的頭像
    Jemmy

    Jemmy Walker

    Jemmy 發表在 痞客邦 留言(0) 人氣()