EJB(Enterprise JavaBeans)是 Java EE(现称 Jakarta EE)平台的核心技术之一,用于开发分布式、可扩展、事务性的企业级应用。以下从基础到高级全面解析 EJB:
一、EJB 基础概念
1. 定义与角色
EJB 是服务器端组件模型,提供事务管理、安全控制、远程访问等企业级服务,无需手动编写底层代码。
2. EJB 类型
- 会话 Bean(Session Bean)
- 无状态会话 Bean(Stateless):不保存客户端状态,适合批量处理、数学计算等。
- 有状态会话 Bean(Stateful):保存客户端会话状态,如购物车。
- 单例会话 Bean(Singleton):全局唯一实例,适合缓存、配置管理。
- 实体 Bean(Entity Bean):已被 JPA(Java Persistence API)取代。
- 消息驱动 Bean(Message-Driven Bean, MDB):异步处理 JMS 消息,解耦服务。
二、EJB 核心组件
1. 接口与实现
- 业务接口:定义客户端调用的方法(如
Calculator
接口)。 - 实现类:使用
@Stateless
/@Stateful
/@Singleton
注解(如CalculatorBean
)。
2. 生命周期管理
- 容器管理 Bean 的创建、池化、销毁,无需手动管理内存。
3. 事务管理
- 容器管理事务(CMT):通过
@TransactionAttribute
注解控制事务边界(如REQUIRED
、REQUIRES_NEW
)。 - Bean 管理事务(BMT):手动控制事务(
UserTransaction
)。
4. 安全机制
- 声明式安全:通过
@RolesAllowed
注解限制方法访问权限。 - 编程式安全:通过
EJBContext.isCallerInRole()
检查权限。
三、EJB 开发流程
1. 开发步骤示例
定义业务接口:
实现无状态会话 Bean:
import javax.ejb.Stateless;@Stateless
public class CalculatorBean implements Calculator {@Overridepublic int add(int a, int b) {return a + b;}
}
客户端调用:
import javax.naming.Context;
import javax.naming.InitialContext;public class Client {public static void main(String[] args) throws Exception {Context ctx = new InitialContext();Calculator calculator = (Calculator) ctx.lookup("java:global/ejb-demo/CalculatorBean!com.example.Calculator");int result = calculator.add(5, 3);System.out.println("Result: " + result);}
}
四、高级特性
1. 远程与本地访问
- 本地接口:同一 JVM 内调用(
@Local
)。 - 远程接口:跨 JVM 调用(
@Remote
),需配置 JNDI 和网络协议。
2. 拦截器(Interceptor)
- 通过
@AroundInvoke
注解实现方法调用前后的切面逻辑(如日志、性能监控)。
3. 定时器服务(Timer Service)
- 使用
@Schedule
注解创建定时任务(如每日数据备份):
@Singleton
public class SchedulerBean {@Schedule(hour = "0", minute = "0")public void dailyBackup() {// 执行备份逻辑}
}
4. 依赖注入(DI)
- 通过
@EJB
注解注入其他 EJB:
@Stateless
public class OrderService {@EJBprivate InventoryService inventoryService; // 注入另一个EJB
}
5. 异步方法调用
- 使用
@Asynchronous
注解实现异步处理:
@Asynchronous
public Future<String> processLargeFile() {// 长时间任务...return new AsyncResult<>("处理完成");
}
五、EJB 与其他技术的关系
- 与 JPA 的结合:通过
@PersistenceContext
注入 EntityManager 管理数据库操作。 - 与 JMS 的结合:MDB 监听 JMS 队列 / 主题,实现消息驱动架构。
- 与 CDI 的结合:使用 CDI(Contexts and Dependency Injection)替代部分 EJB 功能。
六、部署与容器
- 应用服务器:WildFly、GlassFish、WebLogic 等。
- 部署描述符:
ejb-jar.xml
(可选,推荐使用注解)。
七、最佳实践
- 优先使用无状态 Bean:提高可扩展性。
- 细粒度事务控制:避免长事务。
- 避免 EJB 循环依赖:通过接口解耦。
- 性能优化:合理配置池大小、使用异步处理。
八、常见问题
- 远程调用性能:网络开销大,优先使用本地调用。
- 事务超时:通过
@TransactionTimeout
调整超时时间。 - JNDI 查找复杂性:使用依赖注入简化查找。
九、EJB 3.2+ 新特性
- 轻量级 EJB:支持嵌入式容器,减少对重量级应用服务器的依赖。
- WebProfile:简化 EJB 规范,适用于 Web 应用。
十、与微服务对比
- EJB:适合单体应用,依赖 Java EE 容器,强事务一致性。
- 微服务:分布式架构,松耦合,语言无关,需额外实现服务发现、熔断等机制。