Java Bean 和EJB的区别与联系
·
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)。
更多推荐


所有评论(0)