1

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

我使用的一些依赖项包括 Spring 3 MVC、Spring Security、Hibernate 和 JPA。

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

结构:

***Consumer App:***

-Model<br/>
..User.java<br/>
..Card.java<br/>
..Purchase.java<br/>
-Dao<br/>
..UserDAO.java<br/>
..CardDAO.java<br/>
..PurchaseDAO.java<br/>
-Services<br/>
..UserService.java<br/>
..CardService.java<br/>
..PurchaseService.java<br/>

***Admin App:***

Same with few different models, dao's and services.

***API Server:***

Same with few different models, dao's and services.



用户:

@Entity
public class User implements Serializable
{
    /**
     * 
     */
    private static final long serialVersionUID = -5232533507244034448L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @NotEmpty
    @Size(min=2, max=15)
    private String firstname;

    @NotEmpty
    @Size(min=2, max=15)
    private String surname;

    @NotEmpty
    @Email
    private String email;

    @NotEmpty
    @Size(min=6, max=10)
    private String password;

    @OneToOne(mappedBy="user", cascade={CascadeType.ALL})
    private UserRole userRole;

    @OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
    private Set<Card> cards;

    @OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
    private Set<UserOffer> offers;

    @Temporal(TemporalType.TIMESTAMP)
    private Date dob;

    @NotEmpty
    private String sex;

        .......
}


用户道:

@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 应用程序之间创建共享模块的经验丰富的人的简要概述会很棒。

4

1 回答 1

3

重复的代码,尤其是在如此大规模的情况下,总是一个坏主意。记住我的话。即使现在并不可怕,只要您必须修改其中一个共享类,它就会发生。您将立即遇到的问题:

  • 更多的工作,需要在所有项目/类中复制更改
  • 很容易犯错或忘记某事
  • 在运行时和开发期间,不同步的类会让您头疼
  • 未来的开发人员将不知道为什么要重复类以及细微的更改(由于不同步的修改)是否是故意的。

基本上你必须创建一个单独的模块(通用名称很好,API更好,与域相关的东西最好)并依赖它。这个单独的模块包含所有通用代码,并且构建为独立的 JAR,对客户端、服务器等没有任何依赖关系。

所有剩余的项目应该只依赖于公共工件。使用它来维护此类项目。

最后一个提示:普通 JAR 不仅可以包含类,还可以包含 XML 配置文件等资源。如果可以的话,也可以将通用配置文件提取到此 JAR 中,并将其简单地包含在每个客户端应用程序中。由于所有此类文件都将在 CLASSPATH 上可用,因此 Spring 不在乎它们来自何处。

于 2012-09-29T13:54:02.333 回答