2012-09-29 35 views
1

我創建了兩個獨立的Web應用程序以及一個Restful API服務器。
他們是maven項目在eclipse中籤出爲動態web項目分離彈簧3應用程序層到公共共享組件

我使用的一些依賴inlude Spring 3 MVC,Spring Security,Hibernate和JPA。

我的web應用程序和API都使用大量相同的域模型,DAO和服務在每個應用程序中。
他們都有自己的模型,道,服務indepdant副本。

結構:

***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包含的獨立項目/模塊中的最佳方法是?

有沒有人關於如何解決和實施這個建議?

有人在多個彈簧應用程序之間創建共享模塊經驗豐富的簡要概述會很好。

回答

3

重複代碼,特別是在如此大規模的情況下,總是一個糟糕的主意。記住我的話。即使現在不是很糟糕,只要修改其中一個共享類,就會立即生效。這些問題,你會立即體驗:

  • 更多的工作,變更需要在所有項目/班
  • 很容易犯了一個錯誤或忘記的東西被複制
  • 非同步類會引起你的主要頭痛,無論是在運行時還是在開發過程中
  • 未來的開發人員不知道類爲什麼重複,以及是否有意或無意的微妙變化(由於非同步修改)。

基本上你必須創建一個單獨的模塊(共同名字好,API較好,一些領域相關的是最好的),並依賴於它。這個單獨的模塊具有所有通用代碼,並且構建爲獨立的JAR,而不依賴客戶端,服務器等。

所有其餘的項目應該僅僅依賴於常見的工件。 可用於維護此類項目。

最後一個提示:通用JAR不僅可以包含類,還可以包含像XML配置文件這樣的資源。如果可以,請將常用配置文件解壓縮到此JAR中,並將其包含在每個客戶端應用程序中。由於所有這些文件都將在CLASSPATH上提供,因此Spring不關心它們來自哪裏。

相關問題