EJB-종속성 주입

EJB 3.0 사양은 종속성을 주입하기 위해 필드 또는 setter 메서드에 적용 할 수있는 주석을 제공합니다. EJB 컨테이너는 전역 JNDI 레지스트리를 사용하여 종속성을 찾습니다. EJB 3.0에서는 종속성 주입을 위해 다음 주석이 사용됩니다.

  • @EJB − 다른 EJB 참조를 삽입하는 데 사용됩니다.

  • @Resource − sessionContext, timerService 등과 같은 데이터 소스 또는 싱글 톤 서비스를 주입하는 데 사용됩니다.

@EJB 사용 단계

@EJB는 다음과 같은 방식으로 필드 또는 메소드에서 사용할 수 있습니다.

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;
   }
   ...
}

@Resource를 사용하는 단계

@Resource는 일반적으로 EJB 컨테이너 제공 싱글 톤을 주입하는 데 사용됩니다.

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

예제 애플리케이션

EJB에서 Dependency Injection Service를 테스트하기위한 테스트 EJB 애플리케이션을 만들어 보겠습니다.

단계 기술
1

EJB- 애플리케이션 만들기 장에 설명 된대로 com.tutorialspoint.timer 패키지 아래에 EjbComponent 라는 이름의 프로젝트를 만듭니다 .

2

EJB-Message Driven Bean 장 에서 생성 된 Bean을 사용 합니다. 나머지 파일은 변경하지 마십시오.

응용 프로그램을 정리하고 빌드하여 비즈니스 논리가 요구 사항에 따라 작동하는지 확인합니다.

4

마지막으로 JBoss Application Server에 jar 파일 형식으로 애플리케이션을 배포합니다. JBoss Application Server는 아직 시작되지 않은 경우 자동으로 시작됩니다.

5

이제 EJB-응용 프로그램 만들기 장에서 설명한 것과 동일한 방식으로 콘솔 기반 응용 프로그램 인 EJB 클라이언트를 만듭니다.Create Client to access EJB.

EJBComponent (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 (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는 다음 작업을 수행합니다-

  • jndi.properties에서 속성을로드하고 InitialContext 객체를 초기화합니다.

  • testStatefulEjb () 메소드에서 jndi 조회는 Jboss에서 사용할 수있는 큐의 참조를 얻기 위해 "/ queue / BookQueue"라는 이름으로 수행됩니다. 그런 다음 발신자는 대기열 세션을 사용하여 생성됩니다.

  • 그런 다음 사용자에게 라이브러리 저장소 사용자 인터페이스가 표시되고 선택 항목을 입력하라는 메시지가 표시됩니다.

  • 사용자가 1을 입력하면 시스템은 책 이름을 요청하고 발신자는 책 이름을 대기열로 보냅니다. JBoss 컨테이너가 대기열에서이 메시지를 수신하면 메시지 구동 빈의 onMessage 메서드를 호출합니다. 메시지 구동 빈은 stateful 세션 빈 addBook () 메소드를 사용하여 책을 저장합니다. Session Bean은 EntityManager 호출을 통해 데이터베이스에서 책을 유지합니다.

  • 사용자가 2를 입력하면 "LibraryStatefulSessionBean / remote"라는 이름으로 또 다른 jndi 검색이 수행되어 원격 비즈니스 객체 (상태 저장 EJB)를 다시 얻고 도서 목록이 완료됩니다.

클라이언트를 실행하여 EJB에 액세스

프로젝트 탐색기에서 EJBTester.java를 찾습니다. EJBTester 클래스를 마우스 오른쪽 버튼으로 클릭하고run file.

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)

위에 표시된 출력은 Message Driven Bean이 메시지를 수신하고 영구 저장소에 책을 저장하며 책이 데이터베이스에서 검색됨을 나타냅니다.

우리의 메시지 구동 빈은 @EJB 주석을 사용하여 삽입 된 LibraryPersistentBean을 사용하고 있으며 예외의 경우 MessageDrivenContext, 객체를 사용하여 트랜잭션을 롤백합니다.