之前學習過EJB,但是好久沒有使用了,由於項目關係,所以重操舊業。但是發現突然間對EJB使用不是很順手,所以重新瞭解了一下EJB,這次記錄下來吧。
基礎知識這裏就不在贅述了,google一把一把的,就說一下我比較困惑的幾點
1、同一個interface,不可以在同一個實現中,既使用@Remote,又使用@Local
2、同一interface,可以在不同實現中,及使用@Remote,又使用@Local
例子:
public interface IReportDaoLocal {
public void saySomething();
}
實現1
import javax.ejb.Stateless;
@Stateless
public class ReportDaoLocal implements IReportDaoLocal {
@Override
public void saySomething() {
System.out.println("I am in ReportDaoLocal");
}
}
實現2
import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Stateless
@Remote({IReportDaoLocal.class})
public class ReportDaoremote implements IReportDaoLocal {
@EJB(name="ReportDaoLocal")
private IReportDaoLocal reportlocal;
@Override
public void saySomething() {
System.out.println("i am local interface of reportDao Local");
reportlocal.saySomething();
}
}
這樣實現是沒有問題的,下邊這種實現方式是錯誤的
import javax.ejb.Stateless;
@Stateless
@Local({IReportDaoLocal .class})
@Remote({IReportDaoLocal .class})
public class ReportDaoLocal implements IReportDaoLocal {
@Override
public void saySomething() {
System.out.println("I am in ReportDaoLocal");
}
}
3、如果interface 沒有繼承其他interface,則不可以使用@Stateless,@Local,@Remote,如果有其他繼承接口,沒有試驗
例如:
@Stateless
public interface IReportDaoLocal {
public void saySomething();
}
這是錯誤的,雖然沒有寫@Local,只寫@Stateless默認是Local端口
4、如果一個實現類,繼承了另一個實現類,而另一個實現類被標註了@Stateless或者@Remote標註,在Jboss 5服務器中,第一個實現類是不會被JNDI註冊的,即是說,第一個實現類不會成爲服務,只是一個普通的類