让我们举一个基本的例子,比如我们有一个实体类
@Entity
public class User {
}
和处理数据的DAO:
public interface UserDao {
@Transactional
public void changeUser(User user);
}
@Repository
public class UserDaoImpl implements UserDao {
@PersistenceContext
private EntityManager em;
@Override
public void changeUser(User user) {
// ...
}
}
我们有一个主Maven项目,其中包含许多其他子项目,我们用它来构建多个应用程序(WAR,JAR等)。我们选择的框架是Spring。
每个应用程序都需要上面的实体/ DAO,并且不需要每个应用程序自定义,一切都保持不变。 每个应用程序都有自己的数据源/持久性单元/事务管理器。
如何在多个应用程序中最好地重用上述实体/ DAO?实体需要持久保存在应用程序的数据库中,我们还需要重用应用程序的事务管理器。
在类似情况下你做了什么?
答案 0 :(得分:1)
我会创建包含实体和DAO的单独Maven模块(您甚至可以创建两个模块 - 一个用于实体,一个用于DAO)。
此模块将作为依赖项添加到需要DB层的任何其他应用程序模块(EJB或WAR模块)。在Spring配置中,您应该正确定义数据源,持久化上下文,事务管理器等的注入规则。这样,您将拥有不同配置的公共代码。
答案 1 :(得分:0)
我同意,模块化课程很容易;自动化配置查找/加载是棘手的部分。
我想可以为每个模块创建一个applicationContext.xml
(在其中列出bean,控制器等)并使用多配置支持来加载它们。但是很明显,我们无法将所有XML文件命名为以下建议:
主要项目web.xml
:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:auto-appctx-*.xml</param-value>
</context-param>
一个Maven / Ant脚本,可以在打包每个模块/ JAR时为XML文件加上时间戳:
<target name="copy-unique-appctx">
<timestamp/>
<copy src="src/resource/applicationContext.xml"
dest="build/classes/auto-appctx-${timestamp}.xml"/>
</target>
请注意,此Ant目标是“按内存”键入的,此刻是粗略的,需要更正(如果这个想法确实有效)。