Spring生命周期启动方法不起作用

时间:2013-03-10 22:07:33

标签: java spring

我以为我设置了一个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;
    }       
}

我需要这样做的原因是,当我的程序启动时,它需要检查是否已构建地图。如果没有,则需要构建一个。此外,它实际上是设置一个缓存值,Empire的empireGold。

如果有一种比实施生命周期更好,更有效的方法,我会接受建议。否则我只是希望这个工作!

2 个答案:

答案 0 :(得分:2)

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

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

请参阅有关此批注here的Spring文档 有关同一问题的替代解决方案,请查看"Customizing the nature of a bean"上的部分。

答案 1 :(得分:1)

使用@PostConstruct

注释您的开始方法