Tomcat 中的 Webapp 引导代码

Posted

技术标签:

【中文标题】Tomcat 中的 Webapp 引导代码【英文标题】:Webapp bootstrap code in Tomcat 【发布时间】:2011-04-14 21:29:05 【问题描述】:

我正在使用 Spring、Spring Security、Tomcat 和 mysql 开发一个 Java webapp。现在,我仍处于对数据库进行相当频繁的更改以及重新创建数据库以清除测试数据的阶段。最终,这不会是一个问题,但是有没有办法让一个被实例化的 bean 或执行的代码来引导 web 应用程序?我希望能够利用 IoC 功能来使用相同的功能,例如,PasswordEncoder 我的应用程序用于填充原始用户帐户。另外,如果数据库不存在,我想让这个脚本创建数据库等。有没有办法做到这一点?有没有比我建议的更好的方法?我不喜欢我刚才描述的算法,但这是我能想到的传达我正在寻找的东西的最佳方式。

提前致谢!

【问题讨论】:

【参考方案1】:

如果你使用Spring,你可以register a ContextLoaderListener自动启动ApplicationContext。然后,您的 ApplicationContext 可以初始化数据库,最好是通过 JPA 或 Hibernate 以及 using plain jdbc

【讨论】:

这正是我所寻找的,谢谢!【参考方案2】:

创建数据库模式的好方法是liquibase。您还可以插入数据。 Liquibase 通过 bean 提供 Spring 集成:liquibase.spring.SpringLiquibase,因此数据库将在需要时更新。

【讨论】:

这是一个看起来很酷的框架。我一定会调查的。不过,这并不是我想要的:我需要能够从 Java 调用插入查询,以保证我使用相同的编码器。 您在开发期间使用 liquibase 的所有工作都可以适应您的生产环境以进行更改。这是一个很棒的软件【参考方案3】:

您可以使用ApplicationListener 接口实现一个bean。

在收到ContextRefreshedEvent 时执行必要的操作

这种方法的好处是框架会为你加载上下文和所有的 bean,所以你可以访问它们来进行任何你想做的引导。

缺点是这个事件在初始化和刷新时触发

ContextRefreshedEvent 在初始化或刷新 ApplicationContext 时发布。这里初始化意味着所有的bean都被加载,singletons被预实例化,ApplicationContext已经准备好使用了。

【讨论】:

以上是关于Tomcat 中的 Webapp 引导代码的主要内容,如果未能解决你的问题,请参考以下文章

在tomcat中将相同的war文件部署为两次不同的路径

Tomcat正常启动,可以访问tomcat主页,却不能访问webapp中的项目的jsp文件,这是啥原因?

tomcat ROOT中的lib和webapp中的lib的作用

Tomcat 无法获取另一个 web 应用程序的 ServletContext

IntelliJ + Maven + Tomcat 中的 Clojure Webapp

tomcat webapp 故障转移