Java Bean 和 EJB 虽然名字相似,但实际上是完全不同层次的技术。让我详细解释它们的区别与联系。

1. 核心关系概览
特性	|Java Bean			|EJB (Enterprise Java Bean)
定位	|轻量级组件规范		|重量级企业级组件框架
用途	|数据封装、UI组件	|分布式业务逻辑、事务管理
复杂度	|简单				|复杂
容器	|不需要特殊容器		|需要EJB容器
时代	|一直适用			|主要在J2EE时代

2. 本质区别
2.1 Java Bean - 简单的组件规范
java
// Java Bean 就是一个遵循特定规范的普通Java类
public class UserBean {
    // 1. 私有属性
    private String name;
    private Integer age;
    
    // 2. 无参构造器
    public UserBean() {}
    
    // 3. 公共的getter/setter
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    
    public Integer getAge() { return age; }
    public void setAge(Integer age) { this.age = age; }
    
    // 4. 可序列化(可选)
    // 5. 可以有业务方法
    public boolean isAdult() {
        return age != null && age >= 18;
    }
}
2.2 EJB - 企业级组件框架
java
// EJB 需要运行在EJB容器中,提供企业级服务
@Stateless
public class UserServiceEJB {
    
    @PersistenceContext
    private EntityManager entityManager;
    
    // 自动事务管理
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public User createUser(String name, int age) {
        User user = new User(name, age);
        entityManager.persist(user);
        return user;
    }
    
    // 远程调用支持
    @Remote
    public User findUser(Long id) {
        return entityManager.find(User.class, id);
    }
}

3. 详细对比
3.1 设计目标和用途
java
// Java Bean: 主要用于数据封装和UI组件
public class LoginFormBean {
    private String username;
    private String password;
    // getter/setter...
    
    // 简单的验证逻辑
    public boolean validate() {
        return username != null && !username.trim().isEmpty();
    }
}

// EJB: 用于企业级业务逻辑
@Stateful
public class ShoppingCartEJB {
    private List<Product> items = new ArrayList<>();
    
    @EJB
    private InventoryServiceEJB inventoryService;
    
    @EJB
    private PricingServiceEJB pricingService;
    
    // 复杂业务逻辑,涉及多个服务调用和事务
    public Order checkout() {
        // 检查库存、计算价格、创建订单等
        // 所有这些操作在一个事务中
    }
}
3.2 技术特性对比
特性			|Java Bean		|EJB
事务管理		|需要手动处理	|声明式事务支持
安全控制		|需要手动实现	|声明式安全
分布式支持		|不支持			|支持远程调用
生命周期管理	|由开发者管理	|容器管理
依赖注入		|需要手动设置	|容器自动注入
持久化			|需要手动处理	|集成JPA
3.3 部署和运行环境
java
// Java Bean - 可以在任何Java环境中运行
public class SimpleBean {
    // 直接new创建,或者由Spring等轻量级容器管理
    public static void main(String[] args) {
        SimpleBean bean = new SimpleBean();
        bean.setName("test");
    }
}

// EJB - 必须部署在EJB容器中(如JBoss, WebSphere)
@Stateless
public class ComplexEJB {
    // 需要应用服务器支持
    // 部署为 .ear 或 .war 文件
}

4. 历史演进
4.1 技术发展时间线
text
1996: Java Bean 规范发布
    ↓
1998: EJB 1.0 发布 (重量级, 复杂)
    ↓
2003: Spring 框架出现 (挑战EJB的复杂性)
    ↓  
2006: EJB 3.0 发布 (借鉴Spring, 简化开发)
    ↓
现在: Spring成为主流, EJB在传统企业中使用

4.2 EJB 的演进
java
// EJB 2.x (复杂)
public class UserEJB implements EntityBean {
    // 需要实现很多回调方法
    public void ejbActivate() { ... }
    public void ejbPassivate() { ... }
    public void ejbLoad() { ... }
    public void ejbStore() { ... }
    // 需要复杂的配置文件
}

// EJB 3.x+ (简化,借鉴POJO)
@Stateless
public class UserServiceEJB {
    // 像普通Java类一样编写
    @PersistenceContext
    private EntityManager em;
    
    public User findById(Long id) {
        return em.find(User.class, id);
    }
}

5. 实际应用场景
5.1 Java Bean 的典型应用
java
// 1. 数据传输对象 (DTO)
public class UserDTO {
    private Long id;
    private String name;
    private String email;
    // getter/setter...
}

// 2. 表单对象
public class RegistrationForm {
    private String username;
    private String password;
    private String confirmPassword;
    // 验证逻辑
    public boolean isPasswordMatch() {
        return password != null && password.equals(confirmPassword);
    }
}

// 3. UI组件 (在Swing/JavaFX中)
public class UserTableModel extends AbstractTableModel {
    private List<UserBean> users;
    // 表格数据模型
}
5.2 EJB 的典型应用
java
// 1. 无状态会话Bean - 服务类
@Stateless
public class OrderProcessingEJB {
    
    @EJB
    private InventoryServiceEJB inventoryService;
    
    @EJB
    private PaymentServiceEJB paymentService;
    
    @TransactionAttribute(REQUIRED)
    public Order processOrder(Order order) {
        // 分布式事务管理
        inventoryService.updateStock(order);
        paymentService.processPayment(order);
        return orderRepository.save(order);
    }
}

// 2. 有状态会话Bean - 会话管理
@Stateful
public class UserSessionEJB {
    private User currentUser;
    private ShoppingCart cart;
    
    public void login(User user) {
        this.currentUser = user;
        this.cart = new ShoppingCart();
    }
    
    public void addToCart(Product product) {
        cart.addItem(product);
    }
}

// 3. 消息驱动Bean - 异步处理
@MessageDriven(activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationType", 
                             propertyValue = "javax.jms.Queue")
})
public class OrderMessageEJB implements MessageListener {
    
    public void onMessage(Message message) {
        // 异步处理订单消息
        processOrderMessage(message);
    }
}

6. 与现代技术的结合
6.1 Spring 与 Java Bean
java
// Spring 扩展了 Java Bean 的概念
@Component
public class UserService {
    
    @Autowired
    private UserRepository userRepository;
    
    @Transactional  // Spring的声明式事务
    public User createUser(User user) {
        return userRepository.save(user);
    }
}

// 配置类也是Bean
@Configuration
public class AppConfig {
    
    @Bean
    public DataSource dataSource() {
        // 数据源Bean
        return new HikariDataSource();
    }
}
6.2 EJB 3.x 与现代开发
java
// 现代EJB更像Spring Bean
@Stateless
public class ModernUserEJB {
    
    @PersistenceContext
    private EntityManager em;
    
    @Inject  // CDI 依赖注入
    private EmailService emailService;
    
    // 像Spring Service一样使用
    public User registerUser(User user) {
        User saved = em.merge(user);
        emailService.sendWelcomeEmail(user.getEmail());
        return saved;
    }
}

7. 如何选择?
使用 Java Bean 的场景:
java
// ✅ 简单数据封装
public class ApiResponse<T> {
    private boolean success;
    private String message;
    private T data;
    // getter/setter...
}

// ✅ 配置文件映射
@ConfigurationProperties(prefix = "app.datasource")
public class DataSourceProperties {
    private String url;
    private String username;
    private String password;
    // getter/setter...
}

使用 EJB 的场景:
java
// ✅ 需要分布式事务
@Stateless
public class BankingServiceEJB {
    
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void transferMoney(Account from, Account to, BigDecimal amount) {
        // 跨多个数据源的事务
    }
}

// ✅ 需要远程调用
@Remote
public interface OrderServiceRemote {
    Order createOrder(Order order) throws RemoteException;
}
8. 总结
核心区别:

方面		|Java Bean	|EJB
本质		|编码规范	|组件框架
复杂度		|简单		|复杂
容器		|不需要		|需要EJB容器
事务		|手动		|声明式
分布式		|不支持		|支持
现代应用	|广泛使用	|传统企业

联系:
都使用"Bean"这个名字,强调组件化思想
EJB 3.x 后借鉴了Java Bean的简单性
在现代应用中,Spring框架结合了两者的优点

现代开发建议:
大多数场景使用 Java Bean + Spring框架
只有在传统企业系统或需要特定EJB特性时才使用 EJB
Spring Boot 已经成为现代Java企业开发的事实标准
简单来说:Java Bean是基础建筑材料,EJB是已经装修好的精装房。现在大多数人更喜欢用基础材料自己装修(Spring),而不是买精装房(EJB)。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐