9

以下は状況です。

EJB プロジェクトであるビジネス層があります。実際、作成される EJB は 1 つだけです。この EJB は、EJB を呼び出す他のレイヤーにサービス クラスを公開する役割を果たします。このレイヤーにSpring(DI機能を使うため)を導入したいです。

私の懸念は、EJB が呼び出されるたびに、Spring コンテキストが何度もロードされないように、このビジネス層に Spring コンテキストをロードする最良の方法は何ですか?

(Web プロジェクトでは、contextLoaderListener で spring コンテキストを構成するよりも利点があり、アプリケーションの起動時に一度だけ読み込まれます)

次の理由により、同じレイヤーに春を含めることを考えました。

  1. すべての DAO およびサービス クラスの依存関係を構成し、必要に応じてそれらを挿入します。
  2. ビジネス層で休止状態の春のサポートを使用するには。
  3. プロパティをクラスに注入して同じものをシミュレートすることにより、単体テストを容易にします。ビジネスクラス/メソッドをテストするために、他のレイヤーを何度も実行する必要はありません。
  4. ロギングおよびメソッド レベルの監査に AOP (アスペクト指向プログラミング) を使用できるようにするため。

EJB プロジェクトで Spring コンテキストをロードするための最良の方法を提案するのを手伝ってください。また、アプリサーバーに同じものをロードできる場合に代替手段があるかどうかも知りたいです(Webスフィアアプリサーバーを使用しています)。

よろしくお願いいたします。

ジテンドリヤダッシュ

4

3 に答える 3

4

Spring は、常に設定する通常の方法で、アプリケーションの一部として構成する必要があります。次に、EJB 層から Spring Bean にアクセスする必要があります。アクセスするには (この投稿から改作)、次のように Spring Bean を作成します。

@Component
public class SpringApplicationContext implements ApplicationContextAware {
    private static ApplicationContext CONTEXT;
    public void setApplicationContext(ApplicationContext context) throws BeansException {
        CONTEXT = context;
    }
    public static Object getBean(String beanName) {
        return CONTEXT.getBean(beanName);
    }
}

次に、問題の Bean をレガシー アプリから呼び出すには、次のようにします。

SomeService someService = (SomeService)SpringApplicationContext.getBean("someServiceImpl");

Spring コンテキストが一度初期化されると、EJB レイヤーは自由にアクセスできます。

于 2011-10-25T15:05:19.500 に答える
2

EJB3 の場合、Spring はEJB3 インジェクション インターセプターの使用を推奨しています。基本的に、クラスパスの beanContextRef.xml で Spring コンテキストを作成する必要があるContextSingletonBeanFactoryLocatorを使用して Spring コンテキストを指定します。おそらくEARの一部として。SpringBeanAutowiringInterceptor は、Bean を EJB に注入します。

于 2011-11-09T03:39:39.927 に答える
0

EJB をシングルトンとしてマークする ( @Singleton)。そして、Spring コンテキストを一度作成した後、この Bean の変数に格納して、同じコンテキストを何度も返すことができるようにします。

于 2011-10-25T07:38:34.177 に答える