EJB3.0 DI
5867 단어 EJB3
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 방법에 사용할 수 있습니다.