EJB、JPA、JMS等Java EE核心组件

Java EE(Java Platform, Enterprise Edition)是一套企业级应用开发的标准规范,包含了多个核心组件和技术,用于构建高性能、高可靠性的企业级应用。其中,EJB(Enterprise JavaBeans)、JPA(Java Persistence API)和 JMS(Java Message Service)是 Java EE 中非常重要的几个组件。下面详细介绍这几个组件的概念、用途及使用方法。

EJB (Enterprise JavaBeans)

EJB 是 Java EE 规范中用于构建企业级应用的组件模型,它提供了一种编写组件化、可重用的企业级应用程序的方法。EJB 包括了多种类型的企业 bean,如 Session Beans、Entity Beans 和 Message-Driven Beans。

EJB 的主要类型
  1. Session Beans:用于封装业务逻辑,分为有状态(Stateful)和无状态(Stateless)两种。

    • 无状态 Session Bean:每次客户端请求都会创建一个新的实例,不会保存任何状态信息。
    • 有状态 Session Bean:为每个客户端维护一个实例,并保存状态信息。
  2. Entity Beans:用于表示持久化数据的对象,现已逐渐被 JPA 替代。

  3. Message-Driven Beans:用于接收来自 JMS 的消息。

示例代码

下面是一个简单的 Stateless Session Bean 示例:

  1. 定义 Session Bean 接口

    import javax.ejb.Stateless;
    import javax.ejb.Local;

    @Local
    public interface Calculator {
    int add(int a, int b);
    }

  2. 实现 Session Bean

    import javax.ejb.Stateless;

    @Stateless
    public class CalculatorBean implements Calculator {
    @Override
    public int add(int a, int b) {
    return a + b;
    }
    }

  3. 客户端调用 Session Bean

    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import java.util.Properties;

    public class Client {
    public static void main(String[] args) {
    Properties props = new Properties();
    props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
    props.put(Context.PROVIDER_URL, "remote://localhost:4447");
    props.put(Context.SECURITY_PRINCIPAL, "jboss");
    props.put(Context.SECURITY_CREDENTIALS, "password");

         InitialContext ctx = new InitialContext(props);
         Calculator calculator = (Calculator) ctx.lookup("java:global/CalculatorBean!Calculator");
         System.out.println("Result: " + calculator.add(5, 10));
     }
    

    }

JPA (Java Persistence API)

JPA 是 Java EE 规范中的一个标准持久化框架,用于将 Java 对象映射到数据库表。JPA 提供了一种声明式的对象持久化机制,简化了数据库操作。

JPA 的主要特点
  1. 实体映射:将 Java 对象映射到数据库表。
  2. 查询语言:提供了 JPQL(Java Persistence Query Language)和 Criteria 查询。
  3. 事务管理:支持事务管理。
  4. 缓存机制:支持一级缓存和二级缓存。
示例代码

下面是一个简单的 JPA 示例:

  1. 定义实体类

    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;

    @Entity
    public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private int age;

     // Getters and Setters
    

    }

  2. 使用 EntityManager 进行 CRUD 操作

    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;

    public class UserRepository {
    private EntityManagerFactory emf;

     public UserRepository() {
         emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
     }
    
     public void save(User user) {
         EntityManager em = emf.createEntityManager();
         em.getTransaction().begin();
         em.persist(user);
         em.getTransaction().commit();
         em.close();
     }
    
     public User findById(Long id) {
         EntityManager em = emf.createEntityManager();
         User user = em.find(User.class, id);
         em.close();
         return user;
     }
    
     public void update(User user) {
         EntityManager em = emf.createEntityManager();
         em.getTransaction().begin();
         em.merge(user);
         em.getTransaction().commit();
         em.close();
     }
    
     public void delete(User user) {
         EntityManager em = emf.createEntityManager();
         em.getTransaction().begin();
         em.remove(em.contains(user) ? user : em.merge(user));
         em.getTransaction().commit();
         em.close();
     }
    

    }

JMS (Java Message Service)

JMS 是 Java EE 规范中的一个消息传递服务,用于实现异步通信。JMS 支持两种消息传递模式:点对点(Point-to-Point)和发布/订阅(Publish-Subscribe)。

JMS 的主要特点
  1. 消息生产者和消费者:消息生产者发送消息,消息消费者接收消息。
  2. 队列和主题:队列用于点对点模式,主题用于发布/订阅模式。
  3. 事务支持:支持消息传递的事务管理。
示例代码

下面是一个简单的 JMS 示例:

  1. 消息生产者

    import javax.jms.Connection;
    import javax.jms.ConnectionFactory;
    import javax.jms.Destination;
    import javax.jms.MessageProducer;
    import javax.jms.Session;
    import javax.jms.TextMessage;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;

    public class JmsProducer {
    public static void main(String[] args) {
    try {
    InitialContext context = new InitialContext();
    ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("java:/ConnectionFactory");
    Destination destination = (Destination) context.lookup("java:/queue/testQueue");

             Connection connection = connectionFactory.createConnection();
             connection.start();
    
             Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
             MessageProducer producer = session.createProducer(destination);
             TextMessage message = session.createTextMessage("Hello, JMS!");
             producer.send(message);
    
             System.out.println("Message sent: " + message.getText());
    
             session.close();
             connection.close();
         } catch (NamingException | JMSException e) {
             e.printStackTrace();
         }
     }
    

    }

  2. 消息消费者

    import javax.jms.Connection;
    import javax.jms.ConnectionFactory;
    import javax.jms.Destination;
    import javax.jms.Message;
    import javax.jms.MessageListener;
    import javax.jms.Session;
    import javax.jms.TextMessage;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;

    public class JmsConsumer implements MessageListener {
    private Connection connection;
    private Session session;
    private Destination destination;

     public JmsConsumer() throws NamingException, JMSException {
         InitialContext context = new InitialContext();
         ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("java:/ConnectionFactory");
         destination = (Destination) context.lookup("java:/queue/testQueue");
    
         connection = connectionFactory.createConnection();
         session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
         connection.start();
    
         session.createConsumer(destination).setMessageListener(this);
     }
    
     @Override
     public void onMessage(Message message) {
         if (message instanceof TextMessage) {
             TextMessage textMessage = (TextMessage) message;
             try {
                 System.out.println("Received message: " + textMessage.getText());
             } catch (JMSException e) {
                 e.printStackTrace();
             }
         }
     }
    
     public static void main(String[] args) {
         try {
             new JmsConsumer();
         } catch (NamingException | JMSException e) {
             e.printStackTrace();
         }
     }
    

    }

总结

Java EE 核心组件 EJB、JPA 和 JMS 在企业级应用开发中具有重要作用:

  1. EJB:提供了一种编写组件化、可重用的企业级应用程序的方法,支持 Session Beans、Entity Beans 和 Message-Driven Beans。
  2. JPA:提供了对象持久化机制,简化了数据库操作,支持实体映射、查询语言、事务管理和缓存机制。
  3. JMS:提供了消息传递服务,支持异步通信,适用于点对点和发布/订阅模式。

通过掌握这些核心组件,可以更好地利用 Java EE 技术来构建高性能、高可靠性的企业级应用。这些组件相互配合,可以实现复杂的企业级应用功能,如业务逻辑处理、数据持久化和异步消息传递。

相关推荐
何苏三月1 分钟前
设计模式 - 单例模式(懒汉式、饿汉式、静态内部类、枚举)
java·单例模式
Renas_TJOvO5 分钟前
排序算法汇总
java·数据结构·算法
秋恬意15 分钟前
Java 反射机制详解
java·开发语言
爱上语文23 分钟前
LeetCode每日一题
java·算法·leetcode
ღ᭄ꦿ࿐Never say never꧂31 分钟前
重生之我在Java世界------学工厂设计模式
java·设计模式·简单工厂模式·应用场景
尘浮生44 分钟前
Java项目实战II基于Spring Boot的火锅店管理系统设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·微信小程序·旅游
wrx繁星点点44 分钟前
桥接模式:解耦抽象与实现的利器
android·java·开发语言·jvm·spring cloud·intellij-idea·桥接模式
羊小猪~~1 小时前
C/C++语言基础--C++模板与元编程系列二类模板、全特化、偏特化、编译模型简介、实现简单Vetctor等…………)
java·c语言·开发语言·c++·visual studio code·visual studio
l138494274511 小时前
C语言储存变量 java循环语句和循环跳转
java·c语言·开发语言·算法
HHppGo2 小时前
java_封装
java·开发语言