EJB知识

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注解控制事务边界(如REQUIREDREQUIRES_NEW)。
  • Bean 管理事务(BMT):手动控制事务(UserTransaction)。
4. 安全机制
  • 声明式安全:通过@RolesAllowed注解限制方法访问权限。
  • 编程式安全:通过EJBContext.isCallerInRole()检查权限。

三、EJB 开发流程

1. 开发步骤示例

定义业务接口

实现无状态会话 Bean

import javax.ejb.Stateless;

@Stateless
public class CalculatorBean implements Calculator {
    @Override
    public 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 {
    @EJB
    private InventoryService inventoryService; // 注入另一个EJB
}
5. 异步方法调用
  • 使用@Asynchronous注解实现异步处理:
@Asynchronous
public Future<String> processLargeFile() {
    // 长时间任务...
    return new AsyncResult<>("处理完成");
}

五、EJB 与其他技术的关系

  1. 与 JPA 的结合:通过@PersistenceContext注入 EntityManager 管理数据库操作。
  2. 与 JMS 的结合:MDB 监听 JMS 队列 / 主题,实现消息驱动架构。
  3. 与 CDI 的结合:使用 CDI(Contexts and Dependency Injection)替代部分 EJB 功能。

六、部署与容器

  • 应用服务器:WildFly、GlassFish、WebLogic 等。
  • 部署描述符ejb-jar.xml(可选,推荐使用注解)。

七、最佳实践

  1. 优先使用无状态 Bean:提高可扩展性。
  2. 细粒度事务控制:避免长事务。
  3. 避免 EJB 循环依赖:通过接口解耦。
  4. 性能优化:合理配置池大小、使用异步处理。

八、常见问题

  1. 远程调用性能:网络开销大,优先使用本地调用。
  2. 事务超时:通过@TransactionTimeout调整超时时间。
  3. JNDI 查找复杂性:使用依赖注入简化查找。

九、EJB 3.2+ 新特性

  • 轻量级 EJB:支持嵌入式容器,减少对重量级应用服务器的依赖。
  • WebProfile:简化 EJB 规范,适用于 Web 应用。

十、与微服务对比

  • EJB:适合单体应用,依赖 Java EE 容器,强事务一致性。
  • 微服务:分布式架构,松耦合,语言无关,需额外实现服务发现、熔断等机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值