EJB - Tiêm phụ thuộc

Đặc tả EJB 3.0 cung cấp các chú thích, có thể được áp dụng trên các trường hoặc phương thức setter để đưa vào các phụ thuộc. EJB Container sử dụng sổ đăng ký JNDI toàn cầu để xác định vị trí phụ thuộc. Các chú thích sau được sử dụng trong EJB 3.0 để tiêm phụ thuộc.

  • @EJB - được sử dụng để tiêm tham chiếu EJB khác.

  • @Resource - được sử dụng để chèn nguồn dữ liệu hoặc các dịch vụ singleton như sessionContext, timerService, v.v.

Các bước sử dụng @EJB

@EJB có thể được sử dụng trên các trường hoặc trên các phương thức theo cách sau:

public class LibraryMessageBean implements MessageListener {
   //dependency injection on field. 
   @EJB
   LibraryPersistentBeanRemote libraryBean;
   ...
}
public class LibraryMessageBean implements MessageListener {
  
   LibraryPersistentBeanRemote libraryBean;
   
   //dependency injection on method. 
   @EJB(beanName="com.tutorialspoint.stateless.LibraryPersistentBean")
   public void setLibraryPersistentBean(
   LibraryPersistentBeanRemote libraryBean)
   {
      this.libraryBean = libraryBean;
   }
   ...
}

Các bước sử dụng @Resource

@Resource thường được sử dụng để chèn các đĩa đơn được cung cấp bởi EJB Container.

public class LibraryMessageBean implements MessageListener {
   @Resource
   private MessageDrivenContext mdctx;  
   ...
}

Ứng dụng mẫu

Hãy để chúng tôi tạo một ứng dụng EJB thử nghiệm để kiểm tra Dịch vụ tiêm phụ thuộc trong EJB.

Bươc Sự miêu tả
1

Tạo một dự án với tên EjbComponent trong gói com.tutorialspoint.timer như được giải thích trong chương EJB - Tạo ứng dụng .

2

Sử dụng Beans được tạo trong chương EJB - Message Driven Bean . Giữ phần còn lại của các tệp không thay đổi.

3

Làm sạch và xây dựng ứng dụng để đảm bảo logic nghiệp vụ đang hoạt động theo yêu cầu.

4

Cuối cùng, triển khai ứng dụng dưới dạng tệp jar trên Máy chủ ứng dụng JBoss. Máy chủ ứng dụng JBoss sẽ tự động khởi động nếu nó chưa được khởi động.

5

Bây giờ tạo ứng dụng khách EJB, một ứng dụng dựa trên bảng điều khiển theo cách tương tự như đã giải thích trong chương EJB - Tạo ứng dụng theo chủ đềCreate Client to access EJB.

EJBComponent (Mô-đun EJB)

LibraryMessageBean.java

package com.tuturialspoint.messagebean;
 
import com.tutorialspoint.entity.Book;
import com.tutorialspoint.stateless.LibraryPersistentBeanRemote;
import javax.annotation.Resource;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.EJB;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
 
@MessageDriven(
   name = "BookMessageHandler",
   activationConfig = {
      @ActivationConfigProperty( propertyName = "destinationType", 
                                 propertyValue = "javax.jms.Queue"),
      @ActivationConfigProperty( propertyName = "destination", 
                                 propertyValue ="/queue/BookQueue")
   }
)
public class LibraryMessageBean implements MessageListener {
 
   @Resource
   private MessageDrivenContext mdctx;  
 
   @EJB
   LibraryPersistentBeanRemote libraryBean;
 
   public LibraryMessageBean() {        
   }
 
   public void onMessage(Message message) {
      ObjectMessage objectMessage = null;
      try {
         objectMessage = (ObjectMessage) message;
         Book book = (Book) objectMessage.getObject(); 
         libraryBean.addBook(book);
 
      }catch (JMSException ex) {
         mdctx.setRollbackOnly();
      }       
   }   
}

EJBTester (Khách hàng EJB)

EJBTester.java

package com.tutorialspoint.test;
   
import com.tutorialspoint.entity.Book;
import com.tutorialspoint.stateless.LibraryPersistentBeanRemote;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Properties;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.naming.InitialContext;
import javax.naming.NamingException;
 
public class EJBTester {
 
   BufferedReader brConsoleReader = null; 
   Properties props;
   InitialContext ctx;
   {
      props = new Properties();
      try {
         props.load(new FileInputStream("jndi.properties"));
      } catch (IOException ex) {
         ex.printStackTrace();
      }
      try {
         ctx = new InitialContext(props);            
      } catch (NamingException ex) {
         ex.printStackTrace();
      }
      brConsoleReader = 
      new BufferedReader(new InputStreamReader(System.in));
   }
   
   public static void main(String[] args) {
 
      EJBTester ejbTester = new EJBTester();
 
      ejbTester.testMessageBeanEjb();
   }
   
   private void showGUI() {
      System.out.println("**********************");
      System.out.println("Welcome to Book Store");
      System.out.println("**********************");
      System.out.print("Options \n1. Add Book\n2. Exit \nEnter Choice: ");
   }
   
   private void testMessageBeanEjb() {
 
      try {
         int choice = 1; 
         Queue queue = (Queue) ctx.lookup("/queue/BookQueue");
         QueueConnectionFactory factory =
         (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
         QueueConnection connection =  factory.createQueueConnection();
         QueueSession session = connection.createQueueSession( 
         false, QueueSession.AUTO_ACKNOWLEDGE);
         QueueSender sender = session.createSender(queue);
 
         while (choice != 2) {
            String bookName;
            showGUI();
            String strChoice = brConsoleReader.readLine();
            choice = Integer.parseInt(strChoice);
            if (choice == 1) {
               System.out.print("Enter book name: ");
               bookName = brConsoleReader.readLine();
               Book book = new Book();
               book.setName(bookName);
               ObjectMessage objectMessage = 
               session.createObjectMessage(book);
               sender.send(objectMessage); 
            } else if (choice == 2) {
               break;
            }
         }
 
         LibraryPersistentBeanRemote libraryBean = 
         (LibraryPersistentBeanRemote)
		 ctx.lookup("LibraryPersistentBean/remote");
 
         List<Book> booksList = libraryBean.getBooks();
 
         System.out.println("Book(s) entered so far: " 
         + booksList.size());
         int i = 0;
         for (Book book:booksList) {
            System.out.println((i+1)+". " + book.getName());
            i++;
         }           
      } catch (Exception e) {
         System.out.println(e.getMessage());
         e.printStackTrace();
      }finally {
         try {
            if(brConsoleReader !=null) {
               brConsoleReader.close();
            }
         } catch (IOException ex) {
            System.out.println(ex.getMessage());
         }
      }
   }   
}

EJBTester thực hiện các tác vụ sau:

  • Tải các thuộc tính từ jndi.properties và khởi tạo đối tượng InitialContext.

  • Trong phương thức testStatefulEjb (), việc tra cứu jndi được thực hiện với tên - "/ queue / BookQueue" để lấy tham chiếu của hàng đợi có sẵn trong Jboss. Sau đó, người gửi được tạo bằng cách sử dụng phiên hàng đợi.

  • Sau đó, người dùng được hiển thị Giao diện Người dùng trong kho thư viện và họ được yêu cầu nhập một lựa chọn.

  • Nếu người dùng nhập 1, hệ thống sẽ hỏi tên sách và người gửi sẽ gửi tên sách vào hàng đợi. Khi vùng chứa JBoss nhận được thông báo này trong hàng đợi, nó gọi phương thức onMessage của bean được điều khiển thông báo của chúng ta. Sau đó, bean được điều khiển bằng thông điệp của chúng tôi sẽ lưu sách bằng phương thức addBook () phiên trạng thái. Phiên Bean đang duy trì cuốn sách trong cơ sở dữ liệu thông qua lệnh gọi EntityManager.

  • Nếu người dùng nhập 2, thì một tra cứu jndi khác được thực hiện với tên - "LibraryStatefulSessionBean / remote" để lấy lại đối tượng doanh nghiệp từ xa (stateful EJB) và danh sách sách được thực hiện.

Chạy ứng dụng khách để truy cập EJB

Định vị EJBTester.java trong trình khám phá dự án. Nhấp chuột phải vào lớp EJBTester và chọnrun file.

Xác minh kết quả sau trong bảng điều khiển Netbeans.

run:
**********************
Welcome to Book Store
**********************
Options 
1. Add Book
2. Exit 
Enter Choice: 1
Enter book name: Learn EJB
**********************
Welcome to Book Store
**********************
Options 
1. Add Book
2. Exit 
Enter Choice: 2
Book(s) entered so far: 2
1. learn java
1. learn EJB
BUILD SUCCESSFUL (total time: 15 seconds)

Kết quả được hiển thị ở trên cho biết rằng đậu điều khiển Thông báo của chúng tôi đang nhận thông báo và lưu trữ sách trong bộ nhớ liên tục và sách được truy xuất từ ​​cơ sở dữ liệu.

Bean được điều khiển bằng thông điệp của chúng tôi đang sử dụng LibraryPersistsBean được đưa vào nó bằng cách sử dụng chú thích @EJB và trong trường hợp ngoại lệ, MessageDrivenContext, đối tượng được sử dụng để khôi phục giao dịch.