EJB3.0 DI

5867 단어 EJB3
그 서비스 대상을 저장하기 위해서는 서버의 JNDI를 통해 캐시 대상(session bean)이나 메시지 대기열(MDB)을 찾아야 합니다.JNDI 검색은 클라이언트와 실제 서비스 측을 연결하는 관건적인 절차이다.그러나 JNDI 검색에 문자열을 직접 사용하는 것은 우아하지 않다.클라이언트와 서버는 문자열 기반 이름이 일치해야 하는 몇 가지 이유가 있습니다.그것은 번역할 때 인증을 받거나 배치할 때 검사를 받지 못했다.• JNDI에서 되돌아오는 서비스 대상의 유형이 컴파일할 때 검사를 하지 않았기 때문에 실행할 때 변환 (casting) 오류가 발생할 수 있습니다.• 지루한 검색 코드는 자신의try-catch 코드 블록을 가지고 응용 프로그램 간에 중복되고 난잡한 EJB 3.0이다. 어떠한 POJO에게도 간단하고 우아한 방법으로 연근 서비스 대상과 자원을 풀 수 있다.@EJB 주석을 사용하면 EJB 캐시 대상을 EJB 3.0 용기 관리 POJO에 주입할 수 있습니다.만약 주석이 속성 변수에 사용된다면, 용기는 처음 방문하기 전에 그것에 값을 부여할 것이다.Jboss 다음 버전에서 @EJB 주석은javax에서annotation 패키지가javax로 이동했습니다.ejb . 다음 예는 Hello World Bean의 무상태 세션 bean의 캐시 베이스를 Injection Bean 클래스에 주입하는 방법을 보여 줍니다.
    InjectionBean.java  
    package com.foshanshop.ejb3.impl;  
    import com.foshanshop.ejb3.HelloWorld;  
    import com.foshanshop.ejb3.Injection;  
    import javax.annotation.EJB;  
    import javax.ejb.Remote;  
    import javax.ejb.Stateless;  
    @Stateless  
    @Remote ({Injection.class})  
    public class InjectionBean implements Injection {  
    @EJB (beanName="HelloWorldBean")  
    HelloWorld helloworld;  
    public String SayHello() {  
    return helloworld.SayHello(" ");  
    }  
    }   



 
@EJB 주석의 BeanName 속성은 EJB의 클래스 이름 (패키지 이름 없음) 을 지정하고, 다른 속성은 맵pedName은 Bean의 실제 JNDI 이름을 지정합니다.BeanName 또는 mappedName 속성을 사용하여 HelloWorldBean 세션 bean을 찾는 방법을 보여 줍니다.
java 코드
    public class InjectionBean implements Injection {  
    @EJB (beanName="HelloWorldBean")  
    //@EJB (mappedName="HelloWorldBean/remote")  
    HelloWorld helloworld;  
    ..   



 
@EJB 주석이 자바빈 스타일의 setter 방법에 사용되면 용기는 속성을 처음 사용하기 전에 비안의 setter 방법을 자동으로 정확한 매개 변수로 호출합니다.아래의 단편은 이것이 어떻게 하는지 보여 주었다
java 코드
public class InjectionBean implements Injection {  
HelloWorld helloworld;  
@EJB (beanName="HelloWorldBean")  
public void setHelloworld(HelloWorld helloworld) {  
this.helloworld = helloworld;  
}  
..  


 
다음은 InjectionBean의 Remote 비즈니스 인터페이스입니다.
Injection.java
package com.foshanshop.ejb3;
public interface Injection {
public String SayHello();
}


다음은 Session Bean의 JSP 클라이언트 코드: Jboss EJB3.0 인스턴스 자습서
InjectionTest.jsp
<%@ page contentType="text/html; charset=GBK"%>
<%@ page import="com.foshanshop.ejb3.Injection, javax.naming.*, java.util.Properties"%>
<%
Properties props = new Properties();
props.setProperty("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
InitialContext ctx;
try {
ctx = new InitialContext(props);
Injection injection = (Injection) ctx.lookup("InjectionBean/remote");
out.println(injection.SayHello());
} catch (NamingException e) {
out.println(e.getMessage());
}
%>


 
@EJB 주석은 EJB 캐시 대상만 주입할 수 있으며 @EJB 주석을 제외하고 EJB 3.0도 @Resource 주석을 지원하여 JNDI에서 온 모든 자원을 주입합니다.아래의 예에서 어떻게 데이터 원본을 주입하는지 보여 준다.'java:/DefaultMySqlDS'는 데이터 원본DefaultMySqlDS의 전역 JNDI 이름입니다.데이터 소스 구성은 "JBoss 데이터 소스 구성"뒷부분을 참조하십시오.
//author:lihuoming
package com.foshanshop.ejb3.impl;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.foshanshop.ejb3.HelloWorld;
import com.foshanshop.ejb3.Injection;
import javax.annotation.EJB;
import javax.annotation.Resource;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.sql.DataSource;
@Stateless
@Remote ({Injection.class})
public class InjectionBean implements Injection {
@EJB (beanName="HelloWorldBean")
HelloWorld helloworld;
@Resource (mappedName="java:/DefaultMySqlDS")
Jboss EJB3.0 
 : 
DataSource myDb;
public String SayHello() {
String str = "";
try {
Connection conn = myDb.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT studentName FROM student");
if (rs.next()) {
str = rs.getString(1);
}
rs.close();
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
return helloworld.SayHello(str);
}
}


 
만약 JNDI 대상이 로컬 (java:comp/env) JNDI 디렉터리에 있다면, 그에게 감사의 이름을 지정하기만 하면 됩니다. 접두사를 붙일 필요가 없습니다. 예를 들어 메시지connection factory와 메시지 queue를 주입합니다.
@Resource (mappedName="ConnectionFactory")
QueueConnectionFactory factory;
@Resource (mappedName="queue/A")
Queue queue;


 
'well-known'대상에 대해 @Resource 주석은 JNDI 이름을 지정하지 않고 주입할 수 있으며 변수의 유형을 통해 JNDI 이름을 얻을 수 있습니다.다음은 몇 가지 예다.
@Resource
TimerService tms;
@Resource
SessionContext ctx;


@EJB 주석과 마찬가지로 @Resource 주석도 자바빈 스타일의 setter 방법에 사용할 수 있습니다.

좋은 웹페이지 즐겨찾기