JBoss EJB 3.0 引入基於註解的編程模型,徹底簡化了企業 Bean 開發:無需 Home 接口、無需 ejb-jar.xml、部署描述符可選。本文通過一個計算器示例,對比展示標準版(四個接口/類)與簡化版(三個文件)兩種實現方式,並提供完整客戶端調用代碼、Log4j 配置與部署運行步驟。
遵循傳統 EJB 規範,分離業務接口與本地/遠程接口,適合需要同時支援本地與遠程調用的企業級場景。
package org.jboss.tutorial.stateless.bean;
public interface Calculator {
int add(int x, int y);
int subtract(int x, int y);
}
package org.jboss.tutorial.stateless.bean;
import javax.ejb.Remote;
@Remote
public interface CalculatorRemote extends Calculator { }
package org.jboss.tutorial.stateless.bean;
import javax.ejb.Local;
@Local
public interface CalculatorLocal extends Calculator { }
package org.jboss.tutorial.stateless.bean;
import javax.ejb.Stateless;
@Stateless
public class CalculatorBean implements CalculatorRemote, CalculatorLocal {
public int add(int x, int y) { return x + y; }
public int subtract(int x, int y) { return x - y; }
}
關鍵點:@Stateless 標記無狀態會話 Bean,容器自動生成本地/遠程代理;實現類同時實現兩個接口,滿足不同調用場景。
EJB 3.0 允許業務接口直接使用 @Remote 或 @Local,省去額外接口定義,極大減少樣板代碼。
package org.jboss.tutorial.stateless.bean;
import javax.ejb.Remote;
@Remote
public interface Calculator {
int add(int x, int y);
int subtract(int x, int y);
}
package org.jboss.tutorial.stateless.bean;
import javax.ejb.Stateless;
@Stateless
public class CalculatorBean implements Calculator {
public int add(int x, int y) { return x + y; }
public int subtract(int x, int y) { return x - y; }
}
優勢:僅需 2 個文件(接口 + 實現)即可完成無狀態 Bean 開發,符合 EJB 3.0「配置極簡」理念。
package org.jboss.tutorial.stateless.client;
import org.jboss.tutorial.stateless.bean.Calculator;
import javax.naming.InitialContext;
public class Client {
public static void main(String[] args) throws Exception {
InitialContext ctx = new InitialContext();
// 標準版查找:CalculatorRemote.class.getName()
// 簡化版查找:Calculator.class.getName()
Calculator calculator = (Calculator) ctx.lookup(Calculator.class.getName());
System.out.println("1 + 1 = " + calculator.add(1, 1));
System.out.println("1 - 1 = " + calculator.subtract(1, 1));
}
}
註:JNDI 名稱默認為接口全限定名,可通過 @Stateless(mappedName="...") 或 @RemoteBinding 自定義。
jboss-EJB-3.0_Preview_5.zip 缺少 log4j.properties,導致控制台輸出警告。在 classpath 根目錄(如 src/)創建 log4j.properties:
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=record.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %d{hh:mm:ss} %t %c{1} -%m%n
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.MaxFileSize=100KB
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) -%m%n
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.rootLogger=stdout,R
JBOSS_HOME/bin,執行 run.bat -c all(需 all 配置支援 EJB3)ant build 再 ant run,或通過 Eclipse Lomboz/JBoss IDE 熱部署1 + 1 = 2、1 - 1 = 0 即成功EJB 3.0 專家組移除了 Home 接口,旨在讓 Bean 像 POJO 一樣簡單。簡化版將業務接口直接標記為 @Remote,消除了「接口繼承接口」的層層包裹,減少文件數量 50%,降低維護成本。實際項目中,除非同時需要本地與遠程兩種調用方式,否則強烈推薦簡化版。這也是 Spring、Guice 等輕量級框架影響 EJB 3.0 設計的直接體現:約定優於配置,註解替代 XML,接口即服務契約。