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;
import javax.ejb.MessageDriven;
@MessageDriven(
mappedName="destinationQueue",
activationConfig = {
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="messageSelector",
propertyValue="RECIPIENT='ReportProcessor'")
})
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());
}
}
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; // 這時不可再賦值
private DataSource defaultDataSource; // 這時不可再賦值
3. 修飾EntityManager
@PersistenceContext(unitName="EmployeeService")
EntityManager em;
@PersistenceContext(unitName="EmployeeService")
EntityManager em;
4. 修飾EntityManagerFactory
@PersistentUnit(unitName="EmployeeService")
EntityManagerFactory emf;
還有像Transaction的annotation,可是覺得越多越煩,而且也是受Spring IoC的影響,EJB 3提供了開發的方便性,也產生了選擇多樣化上的不便性,這是在組合成開發上專用Framework時必要考量。
全站熱搜
留言列表