1

我以为我设置了一个 spring bean,以便当我的 web 应用程序上下文被初始化时 start 方法运行,但它没有运行。当我在调试模式下启动我的应用程序时,我从未在 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;
    }       
}

我需要这样做的原因是,当我的程序启动时,它需要检查是否已经构建了地图。如果没有,则需要构建一个。此外,它本质上是在设置一个缓存值,即帝国的 EmpireGold。

如果有比实施 Lifecycle 更好、更有效的方法来做到这一点,我愿意接受建议。否则我只是想让这个工作!

4

2 回答 2

2

有不止一种方法可以指示 Spring 在创建 bean 后运行一些初始化逻辑。我个人的偏好是使用@PostConstruct注解,因为它是一个javax.annotation独立于 Spring 或任何其他容器的标准(在包中定义)。

如果您选择此解决方案并使用 注释您的start()方法@PostConstruct,请不要忘记包含<context:annotation-config/>在您的配置中,否则它将被忽略。

请在此处查看有关此注释的 Spring 文档。
有关同一问题的替代解决方案,请查看“自定义 bean 的性质”部分。

于 2013-03-10T22:40:40.297 回答
1

用注释你的 start 方法@PostConstruct

于 2013-03-10T22:41:10.357 回答