1

Bootstrapperクラスパスから XML ファイルを読み取り、実行時に他のクラスによって軽量の依存関係インジェクターとして使用できるクラスを作成しました。

<!-- myAppConfig.xml -->
<appConfig>
    <environment runningOn="LOCAL" host="localhost.example.com" system="Windows 7"/>
</appConfig>

public class Bootstrapper
{
    private String runningOn = "Unknown";
    private String host = "Unknown";
    private String system = "Unknown";

    public Bootstrapper(final String appConfigFileName)
    {
        setRunningOn(extractRunningOn(appConfigFileName));
        setHost(extractHost(appConfigFileName));
        setSystem(extractSystem(appConfigFileName));
    }

    public String getHost()
    {
        return host;
    }

    // Rest of class ommitted for brevity...
}

// Then in an executable JAR's main method:
public static void main(String[] args)
{
    Bootstrapper bootstrapper = new Bootstrapper("myAppConfig.xml");

    // Prints: "This app is running on the localhost.example.com server node."
    System.out.println("This app is running on the " +
        bootstrapper.getHost() + " server node.");
}

そういう意味appConfigでは、軽量の「DI」機構としての役割を果たしています。Bootstrapper

私が疑問に思っているのは、この設計を WAR の web.xml と EAR の server.xml に変換するにはどうすればよいかということです。

実行可能な JAR では、mainメソッドは を明示的にインスタンス化し、Bootstrapperそのフィールド/プロパティを問い合わせることができますが、WAR/EAR では、単一の「エントリ ポイント」なしですべてが XML ファイル ( web.xml/ ) で定義されます。server.xmlしたがって、WAR または EAR で、それぞれがローカル ホスト名を知る必要がある複数のクラスがある場合、同じインスタンスを何度も何度もインスタンス化し、毎回Bootstrapper同じものを渡す必要があります。myAppConfig.xml

web.xml と server.xml を構成して、起動/展開時に a をインスタンス化し、その場で依存クラスを自動的に注入/設定する方法があるかどうか疑問に思っていますBootstrapper(または、少なくとも、各依存クラスを与える) XML ファイルで定義されたグローバル/シングルトンへのクラスアクセス)。Bootstrapper

前もって感謝します!

4

1 に答える 1

1

war (および war が含まれているので ear) プロジェクトの場合、ServletContextListener を使用して Bootstrapper をインスタンス化できます。

ServletContextListener の使用方法の良い例はhereです。

ただし、Java EE 6 を使用している場合は、EJB 3.1 シングルトンといくつかの CDI を使用することをお勧めします。

import javax.ejb.Singleton
import javax.ejb.Startup
import javax.enterprise.context.ApplicationScoped

@Singleton         // EJB 3.1 Singleton
@Startup           // Telling the container to eagerly load on startup
@ApplicationScoped // CDI Scope
public class Bootstrapper {

    private String host = "Unknown";

    @PostConstruct
    public void readConfiguration() {
        // ... load your xml file
    }

    public String getHost() {
        return host;
    }
}

上記を使用すると、単純な @Inject または @EJB アノテーションを使用して、ほとんどの EE 6 エコシステム内にこの Bootstrapper Bean を注入できるようになりました。

于 2012-05-01T07:59:54.860 に答える