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

时间:2012-09-29 13:10:47

标签: spring spring-mvc

我创建了两个独立的Web应用程序以及Restful API Server 它们是在eclipse中作为动态Web项目检出的maven项目

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

我的两个Web应用程序和API都在每个应用程序中使用了大量相同的域模型,DAO和服务。
他们都有自己的模型,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;

        .......
}


UserDAO的:

@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();
    }
}


UserService:

@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包含的单独项目/模块中的最佳方法吗?

有没有人就如何处理和实施这个问题提出建议?

来自在多个弹簧应用程序之间创建共享模块的经验丰富的人员的简要概述将非常棒。

1 个答案:

答案 0 :(得分:3)

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

  • 更多工作,需要在所有项目/类中重复更改
  • 很容易犯错或遗忘
  • 未同步的类会在运行时和开发期间引起严重的麻烦
  • 未来的开发人员将不知道为什么要重复这些类,以及是否有意或无意地进行微妙的更改(由于不同步的修改)。

基本上你必须创建一个单独的模块(通用名称是好的, API 更好,与域相关的东西是最好的)和依靠它。这个独立的模块具有所有通用代码,并且构建为独立的JAR,不依赖于客户端,服务器等。

所有剩余的项目应该仅仅取决于常见的工件。 用于维护此类项目。

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