将Spring 3应用程序层分离为公共共享组件

将Spring 3应用程序层分离为公共共享组件,spring,spring-mvc,maven,Spring,Spring Mvc,Maven,我创建了两个独立的web应用程序以及一个Restful API服务器。 它们是在eclipse中作为动态web项目签出的maven项目 我使用的一些依赖项包括Spring3MVC、SpringSecurity、Hibernate和JPA 我的web应用程序和API都在每个应用程序中使用了大量相同的域模型、DAO和服务。 他们都有自己的模型、dao和服务的独立副本 结构: 用户: 用户道: @Repository public class UserDAO extends AbstractJpaD

我创建了两个独立的web应用程序以及一个Restful API服务器。 它们是在eclipse中作为动态web项目签出的maven项目

我使用的一些依赖项包括Spring3MVC、SpringSecurity、Hibernate和JPA

我的web应用程序和API都在每个应用程序中使用了大量相同的域模型、DAO和服务。 他们都有自己的模型、dao和服务的独立副本

结构:

用户:

用户道:

@Repository
public class UserDAO extends AbstractJpaDAO<User> implements IUserDAO
{
    @PersistenceContext
    EntityManager entityManager;

    public UserDAO()
    {
        setClazz(User.class);
    }

    public User findOneByEmail(String email)
    {
        return (User) entityManager
                .createQuery("SELECT u FROM User u WHERE u.email = :email")
                .setParameter("email", email).getSingleResult();
    }
}
用户服务:

@Service
public class UserService implements IUserService
{
    @Autowired
    private IUserDAO userDAO;

    public UserService()
    {

    }

    @Transactional
    public List<User> getAll()
    {
        return userDAO.findAll();
    }

    @Transactional
    public User getById(Long id)
    {
        return userDAO.findOne(id);
    }

        ...
}
如您所见,我需要删除这些副本,并在可能的情况下为每个模型、dao和服务创建一个副本

从web应用程序和API中删除我的模型、dao和服务,并将它们放在单独的项目/模块中(应作为jar包含)的最佳方法是什么

有没有人对如何实现这一点提出建议?
如果您有在多个spring应用程序之间创建共享模块的经验,请简要介绍一下。

复制代码,尤其是在如此大规模的情况下,这总是一个坏主意。记住我的话。即使现在还不糟糕,但只要您必须修改其中一个共享类,就可以了。您将立即遇到的问题:

需要在所有项目/类中复制更多工作和更改 犯错误或忘记某事是很容易的 无论是在运行时还是在开发过程中,不同步的类都会给您带来很大的麻烦 未来的开发人员将不知道为什么要复制类,也不知道由于不同步的修改而产生的细微变化是否是有意的。 基本上,您必须创建一个单独的模块,通用名是好的,API更好,与域相关的东西是最好的,并且依赖于它。这个单独的模块具有所有公共代码,并且构建为一个独立的JAR,不依赖于客户机、服务器等

所有剩余的项目都应该仅仅依赖于公共工件。使其用于维护此类项目

最后一个提示:公共JAR不仅可以包含类,还可以包含XML配置文件等资源。如果可以的话,也可以将公共配置文件提取到这个JAR中,并简单地将其包含在每个客户端应用程序中。因为所有这些文件都可以在类路径上使用,所以Spring不关心它们来自哪里

@Repository
public class UserDAO extends AbstractJpaDAO<User> implements IUserDAO
{
    @PersistenceContext
    EntityManager entityManager;

    public UserDAO()
    {
        setClazz(User.class);
    }

    public User findOneByEmail(String email)
    {
        return (User) entityManager
                .createQuery("SELECT u FROM User u WHERE u.email = :email")
                .setParameter("email", email).getSingleResult();
    }
}
@Service
public class UserService implements IUserService
{
    @Autowired
    private IUserDAO userDAO;

    public UserService()
    {

    }

    @Transactional
    public List<User> getAll()
    {
        return userDAO.findAll();
    }

    @Transactional
    public User getById(Long id)
    {
        return userDAO.findOne(id);
    }

        ...
}