EJB 3.0 摒棄了 2.x 時代繁瑣的 Home/Remote 介面、XML 部署描述符、強制容器管理,轉而採用 **Plain Old Java Object (POJO) + 元數據註解** 模式。開發者專注業務邏輯,容器通過註解提供事務、安全、持久化、依賴注入等企業級服務。
@Stateless(name = "CalculateEJB")
public class CalculateEJBBean implements CalculateEJB {
private int value = 0; // 警示:無狀態 Bean 不應依賴實例變量保持狀態!
public String incrementValue() {
value++; // 此處有併發安全隱患,僅作示範
return "value incremented by 1";
}
}
@Remove 方法調用 → 容器銷毀實例。Serializable。@Stateful
public class ShoppingCartBean implements ShoppingCart {
private List- items = new ArrayList<>();
public void addItem(Item item) { items.add(item); }
public List
- getItems() { return items; }
@Remove
public void checkout() { /* 處理訂單 */ }
}
EJB 3.0 整合 Java Persistence API (JPA),實體 Bean 成為標準 JPA 實體類,可脫離 EJB 容器獨立運行(如 Spring Data JPA、Java SE 環境)。
@Entity
@Table(name = "EMPLOYEES")
public class Employee implements Serializable {
@Id
@Column(name = "EMPNO")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int empId;
@Column(name = "ENAME", length = 50)
private String eName;
@Column(name = "SAL")
private double sal;
// Getter/Setter 省略...
@Transient // 非持久化字段
private String displayName;
}
@GeneratedValue 支援 IDENTITY、SEQUENCE、TABLE、AUTO 四種生成策略。@OneToMany、@ManyToOne、@ManyToMany、@OneToOne 完整支援雙向/單向關聯。fetch 屬性調整。EntityManager.detach()、merge() 支援長會話場景。MessageListener + @MessageDriven@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destinationName", propertyValue = "jms/OrderQueue"),
@ActivationConfigProperty(propertyName = "messageSelector", propertyValue = "ORDER_TYPE = 'URGENT'")
})
public class OrderProcessorMDB implements MessageListener {
@Resource
private MessageDrivenContext mdbContext;
@Inject
private OrderService orderService;
public void onMessage(Message message) {
try {
if (message instanceof ObjectMessage) {
Order order = (Order) ((ObjectMessage) message).getObject();
orderService.processUrgentOrder(order);
}
} catch (JMSException e) {
// 異常處理:可選重發、死信隊列、告警
throw new EJBException("訊息處理失敗", e);
}
}
}
maxSession 限制並發消費者數量。REQUIRED,onMessage 失敗自動回滾並重發(依隊列配置)。Context ctx = new InitialContext();
CalculateEJB ejb = (CalculateEJB) ctx.lookup("java:global/app/CalculateEJBBean!rmi.demo.CalculateEJB");
ejb.incrementValue();
@EJB
private CalculateEJB calculateEJB; // 容器自動注入代理對象
@Local:同 JVM 呼叫,傳遞引用,高效能,支援傳遞非序列化對象。@Remote:跨 JVM/網絡呼叫,傳遞序列化副本,需實現 Serializable。EJB 3.0 以「配置即代碼」重新定義了企業級 Java 開發體驗,配合 CDI、JPA、Bean Validation 形成現代 Java EE/Jakarta EE 技術棧的核心基石。