1

2 つの別個の Web アプリケーションと、Restful API サーバーを作成しました。
これらは、Eclipse 内の動的 Web プロジェクトとしてチェックアウトされた Maven プロジェクトです。

私が使用しているいくつかの依存関係には、Spring 3 MVC、Spring Security、Hibernate、および JPA が含まれます。

私の Web アプリケーションと API はどちらも、各アプリケーションで多数の同じドメイン モデル、DAO、およびサービスを利用しています。
それらはすべて、モデル、dao、サービスの独自の独立したコピーを持っています。

構造:

***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;

        .......
}


ユーザー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、サービスのコピーを 1 つずつ用意する必要があります。

モデル、DAO、およびサービスを Web アプリケーションおよび API から削除し、jar として含める必要がある別のプロジェクト/モジュールに配置する最善の方法はありますか?

これにアプローチして実装する方法について誰か提案がありますか?

複数のSpringアプリケーション間で共有モジュールを作成した経験のある人からの簡単な概要は素晴らしいでしょう.

4

1 に答える 1

3

特にこのような大規模な重複コードは、常に悪い考えです。私が言ったことを覚えておいてくださいね。今はひどいことではありませんが、共有クラスの1つを変更する必要があるとすぐになります。すぐに発生する問題:

  • より多くの作業、変更はすべてのプロジェクト/クラス間で複製する必要があります
  • 間違いを犯したり、何かを忘れたりするのは簡単です
  • 同期されていないクラスは、実行時と開発中の両方で大きな頭痛の種になります
  • 将来の開発者は、クラスが複製される理由や、(同期されていない変更による)微妙な変更が意図的なものであるかどうかを知ることはできません。

基本的には、別のモジュールを作成し(一般名が適切、APIが適切、ドメイン関連のものが最適)、それに依存する必要があります。この個別のモジュールにはすべての共通コードがあり、クライアントやサーバーなどに依存することなくスタンドアロンJARとして構築されます。

残りのすべてのプロジェクトは、単に共通のアーティファクトに依存する必要があります。は、そのようなプロジェクトを維持するためにそれを使用します。

最後のヒント:一般的なJARには、クラスだけでなく、XML構成ファイルなどのリソースも含めることができます。可能であれば、一般的な構成ファイルもこのJARに抽出し、各クライアントアプリに含めるだけです。このようなファイルはすべてCLASSPATHで利用できるため、Springはそれらがどこから来たのかを気にしません。

于 2012-09-29T13:54:02.333 に答える