1

Webアプリケーションコンテキストが初期化されたときにstartメソッドが実行されるように、Spring Beanを設定したと思いましたが、実行されていません。アプリケーションをデバッグモードで起動すると、startメソッドのブレークポイントに到達することはありません。クラスの設定方法は次のとおりです。

@Transactional
@Service
public class ServerStartup implements Lifecycle {

    @Autowired
    private EmpireService es;

    /**
     * sets up the server the first time. Should only be called once
     */
    private boolean setup() {
            [... sets stuff up, saves the empire]
    }

    /**
     * initializes the Empire with its necessary value
     */
    @Override
    public void start() {
        Empire empire = es.getEmpire();
        if (empire == null) {
            //initialize all data as there is no "empire"
            this.setup();
            empire = es.getEmpire();
        }
        Empire.setEmpireGold(empire.getInstanceEmpireGold());

    }

    /**
     * does nothing
     */
    @Override
    public void stop() {
    }

    /**
     * does nothing
     */
    @Override
    public boolean isRunning() {
        return false;
    }       
}

これを行う必要がある理由は、プログラムの起動時に、マップが作成されているかどうかを確認する必要があるためです。そうでない場合は、ビルドする必要があります。また、基本的には、キャッシュされた値であるEmpireのempireGoldを設定しています。

ライフサイクルを実装するよりも、これを行うためのより良い、より効率的な方法があれば、私は提案を受け入れるでしょう。そうでなければ、私はこれを機能させたいだけです!

4

2 に答える 2

2

Beanの作成後に初期化ロジックを実行するようにSpringに指示する方法は複数あります。私の個人的な好みは、注釈を使用することです。これは、Springやその他のコンテナーから独立し@PostConstructた標準(パッケージで定義)だからです。javax.annotation

このソリューションを使用してstart()メソッドに注釈を付ける場合は、構成@PostConstructに含めることを忘れない<context:annotation-config/>でください。そうしないと、無視されます。

このアノテーションに関するSpringのドキュメントはこちらをご覧ください
同じ問題の代替ソリューションについては、「Beanの性質のカスタマイズ」のセクションを確認してください。

于 2013-03-10T22:40:40.297 に答える
1

startメソッドにアノテーションを付けます@PostConstruct

于 2013-03-10T22:41:10.357 に答える