0

スタンドアロンの Spring アプリケーションを Spring MVC アプリに変換または統合する。

次の構造を持つSpring MVCアプリケーションがあります

myApp
 |- META-INF
 |- WEB-INF
        |-classes
            |-com
                |-controllers
                |-service
        |-lib
           |-UserLibrary.jar
                |-META-INF
                    |-applicationContext.xml
                    |-dbre.xml
                    |-ehcache.xml
                    |-DataSource.xml
                    |-Jpa.xml
                    |-SpringDataJpa.xml
        |-applicationContext.xml
        |-myApp-servlet.xml

Spring MVC は、通常のプロセスに従ってロードされます。つまり、コントローラには@Controllers、サービスには@Serviceなどの注釈が付けられます。

userLibrary.jar以前は、独自の Spring/JPA 構成を持つスタンドアロンの Spring アプリケーションでした。MVC アプリケーションに統合できるように変換されました。独自の構成ファイル (合計で約 7 個)、独自の Hibernate/JPA エンティティ マネージャーなどがあります。

Spring MVC アプリケーションで使用するために、WebApplicationContext の初期化が完了したときに UserLibrary アプリケーションのアプリケーション コンテキストをロードするように、サービス クラスにわずかな変更を加えました。

public class MyAppService implements
        ApplicationListener<ContextRefreshedEvent> {

    protected UserLibraryService service;

        --
        -- several service methods etc
        --

    System.getProperty("username", "userA");
    System.getProperty("password", "userB");    

    @Override
    public void onApplicationEvent(ContextRefreshedEvent arg0) {        
        ApplicationContext context = 
         new ClassPathXmlApplicationContext("META-INF/userLibrary.xml");
        service = context.getBean(UserLibrary.class);
    }
}   

上記のアプローチによりWebApplicationContext、MVC アプリケーション用とApplicationContextUserLibrary アプリケーション用の 2 つのコンテナーが作成されます。上記は正しい/最善の方法ではないと思うので、最善の方法についてアドバイスを求めています。たとえば、2 つではなく 1 つのコンテナーを使用できますか?

アップデート:

これが私が試したことです。MVC アプリケーションのUserLibraryからアプリケーションの構成ファイルをインポートしました。applicationContext.xml

<import resource="classpath:META-INF/applicationContext.xml" />

UserLibraryBean次に、MVC アプリケーションのapplicationContext.xmlファイル (インポート ステートメントを含む同じファイル)に を追加しました。

<bean class="com.service.UserLibraryService"/>

いくつかの質問:

  • 更新されたアプローチは 1 つのコンテナーのみを使用しますか、それとも 2 つのコンテナーを引き続き使用しますか?
  • UserLibraryService は、初期化中に次のプロパティを読み取ります

    System.getProperty("ユーザー名"); System.getProperty("パスワード");

私の元の例では、onApplicationEventメソッドで上記の値を設定し、UserLibrayそれらを読み取ることができます。

これらはもう設定されていないように見えるため、UserLibraryアプリケーションからプロパティが設定されていないというエラーが表示されます。Service クラスのコンストラクターでも設定しようとしましたが、まだ設定されていません。

xml ファイルの Bean 定義の一部としてシステム プロパティを設定する方法はありますか? プロパティをサービス オブジェクトで使用できるようにするには、どこでプロパティを設定できますか?

ありがとう

4

2 に答える 2

2

Web アプリケーションの web.xml の context-param / contextConfigLocation パラメーターで、複数の構成 xml ファイルを指定できます。

ファイル名にプレフィックスを使用しclasspath:て、クラスパスからロードできます

于 2013-01-06T17:00:40.867 に答える
1

次のような複数の構成ファイルを読み取ることができます-

ApplicationContext context = 
         new ClassPathXmlApplicationContext(new String[] {"META-INF/userLibrary.xml",
              "META-INF/transaction.xml"});

また、使用できます-

<import resource="META-INF/userLibrary.xml"/>
于 2013-01-06T17:28:01.817 に答える