首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JBoss EJB 3.0 無狀態會話 Bean 開發全攻略:標準版與簡化版對比實戰

     編輯:Java 相關知識

EJB 3.0 核心優勢:註解驅動,告別繁瑣 XML

JBoss EJB 3.0 引入基於註解的編程模型,徹底簡化了企業 Bean 開發:無需 Home 接口、無需 ejb-jar.xml、部署描述符可選。本文通過一個計算器示例,對比展示標準版(四個接口/類)與簡化版(三個文件)兩種實現方式,並提供完整客戶端調用代碼、Log4j 配置與部署運行步驟。

標準版實現:本地/遠程接口分離

遵循傳統 EJB 規範,分離業務接口與本地/遠程接口,適合需要同時支援本地與遠程調用的企業級場景。

1. 業務接口 Calculator.java

package org.jboss.tutorial.stateless.bean;

public interface Calculator {
    int add(int x, int y);
    int subtract(int x, int y);
}

2. 遠程接口 CalculatorRemote.java

package org.jboss.tutorial.stateless.bean;
import javax.ejb.Remote;

@Remote
public interface CalculatorRemote extends Calculator { }

3. 本地接口 CalculatorLocal.java

package org.jboss.tutorial.stateless.bean;
import javax.ejb.Local;

@Local
public interface CalculatorLocal extends Calculator { }

4. Bean 實現類 CalculatorBean.java

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,容器自動生成本地/遠程代理;實現類同時實現兩個接口,滿足不同調用場景。

簡化版實現:業務接口直接標記 @Remote

EJB 3.0 允許業務接口直接使用 @Remote 或 @Local,省去額外接口定義,極大減少樣板代碼。

1. 業務接口 Calculator.java(直接標記 @Remote)

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

2. Bean 實現類 CalculatorBean.java

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「配置極簡」理念。

統一客戶端調用代碼 Client.java

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 自定義。

Log4j 配置:解決「No Appender」警告

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

部署與運行步驟

  1. 啟動 JBoss:進入 JBOSS_HOME/bin,執行 run.bat -c all(需 all 配置支援 EJB3)
  2. 構建部署:使用 Ant,先 ant build 再 ant run,或通過 Eclipse Lomboz/JBoss IDE 熱部署
  3. 驗證:控制台輸出 1 + 1 = 2、1 - 1 = 0 即成功

深度討論:為何簡化版更符合 EJB 3.0 精神?

EJB 3.0 專家組移除了 Home 接口,旨在讓 Bean 像 POJO 一樣簡單。簡化版將業務接口直接標記為 @Remote,消除了「接口繼承接口」的層層包裹,減少文件數量 50%,降低維護成本。實際項目中,除非同時需要本地與遠程兩種調用方式,否則強烈推薦簡化版。這也是 Spring、Guice 等輕量級框架影響 EJB 3.0 設計的直接體現:約定優於配置,註解替代 XML,接口即服務契約。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved