让我们来简单的例子,假设我们有一个实体类
@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项目,我们用来构建多个应用程序(战争,JAR文件等)。 我们选择的框架是春天。
每一个应用程序需要上述实体/ DAO和有不需要每个应用程序的定制,一切依旧。 每个应用程序都有其自己的数据源/持久单元/事务管理。
如何才能最好的重复使用跨多个应用程序上面的实体/ DAO? 该实体需要在应用程序的数据库被保留,我们还就需要重新使用应用程序的事务管理器。
那你在类似的情况吗?
我会创建单独的Maven模块,将包含实体和DAO(你甚至可以创建两个模块 - 一个用于实体和一个用于DAO的)。
该模块将被添加作为一个依赖于任何其他应用程序模块(EJB或WAR模块),这需要DB层。 在Spring配置必须先定义数据源,持久化上下文,事务管理,等等。这样,注射的规则,你将有不同的配置公共代码。
我同意,模块化类是比较容易的部分; 自动配置查找/加载的是棘手的部分。
我想一个可以创建一个applicationContext.xml
为每个模块(清单豆在其中,控制器等),并使用所述多个配置支持加载它们。 但是,因为显然我们不能说出所有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目标是“通过记忆”,这是粗略的时刻,需要加以纠正(如果这个想法实际工作)类型。