0

Spring Framework を Hibernate と統合する方法を研究していますが、それについて疑問があります。

うまく機能する個人的な例を開発しましたが、このプロジェクトのアーキテクチャについてはわかりません。

したがって、DAOで行うCRUD操作を宣言したPersonDAOという名前のインターフェースがあります

次に、前のインターフェースを実装するクラスPersonDAOImplによって、このインターフェースの具体的な実装を作成しました。

次に、dao オブジェクトをテストするために次のメイン クラスを作成しました。

package org.andrea.myexample.HibernateOnSpring;

import org.andrea.myexample.HibernateOnSpring.dao.PersonDAOImpl;
import org.andrea.myexample.HibernateOnSpring.entity.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {

public static void main( String[] args ){

    ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
    System.out.println("Contesto recuperato: " + context);

    Person persona1 = new Person();

    persona1.setFirstname("Pippo");
    persona1.setLastname("Blabla");
    persona1.setPid(1);

    System.out.println("Creato persona1: " + persona1);

    PersonDAOImpl dao = (PersonDAOImpl) context.getBean("personDAOImpl");

    System.out.println("Creato dao object: " + dao);

    dao.addPerson(persona1);

    System.out.println("persona1 salvata nel database");

}

}

DAO は正常に機能し、オブジェクトはデータベースに正しく永続化されていますが、次のアーキテクチャ上の疑問があります:インターフェイスを使用していないのに、なぜインターフェイスがあるのですか?

最後に、このように、私はインターフェイスを持つことができず、具象クラスを直接使用できませんでした...

建築的には、これはとても悪いと思います...

App.java クラスを変更して、DAO オブジェクトを次のように使用しようとしました。

PersonDAO dao = (PersonDAO) context.getBean("personDAOImpl");

しかし、動作しません...

このチュートリアル: http://viralpatel.net/blogs/spring3-mvc-hibernate-maven-tutorial-eclipse-example/

インターフェイスを実際に使用する別の状況があります。魔女にはContactServiceImplクラスがあり、 @Autowiredアノテーションを使用して宣言されたContactDAO変数があります。

@Autowired
private ContactDAO contactDAO;

ContactDAOは DAOインターフェースですが、Spring はその実装 ContactDAOImpl のインスタンスであるオブジェクトを自動配線します ( @Repositoryを使用して注釈が付けられます)。

したがって、**@Autowired アノテーションを使用すると、このコードでインターフェイスを使用して変数を宣言できますが、この変数にはその具体的な実装への参照を入れることができます!!!

私のプロジェクトでは、注釈 Bean 構成メカニズムを使用していませんが、XML 構成メカニズムを使用しています...しかし、この場合も同様のことができると思います...

私はプロジェクトの XML 構成ファイルで、次のように Bean を宣言しました。

<bean id="personDAOImpl" class="org.andrea.myexample.HibernateOnSpring.dao.PersonDAOImpl" >
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

dao 変数をインターフェイスとして宣言し、具体的な実装を入れるにはどうすればよいですか? (まだ XML 構成を使用)

これは、使用時に発生するスタック トレース エラーです。

    PersonDAO dao = (PersonDAO) context.getBean("personDAOImpl");

私のApp.Javaテストクラスで

情報: HibernateTransactionManager に Hibernate SessionFactory の DataSource [org.apache.commons.dbcp.BasicDataSource@7363c839] を使用する]; スレッド「メイン」のコンテキスト hierarchyException のルート Creato persona1: org.andrea.myexample.HibernateOnSpring.entity.Person@23653628 java.lang.ClassCastException: org.andrea.myexample.HibernateOnSpring.dao.PersonDAOImpl$$EnhancerByCGLIB$$d46b3a86 はできませんorg.andrea.myexample.HibernateOnSpring.dao.PersonDAO に org.andrea.myexample.HibernateOnSpring.App.main(App.java:27) にキャストします。

Tnx アンドレア

4

2 に答える 2

1

インターフェイスと具体的な実装の本質は、ポリモーフィズムを維持することです。テスト環境では、異なる具体的な実装を使用できますが、同じインターフェイスを使用できますが、開発モードでは、別の実装を xml 構成に入れることができます。開発環境からテスト環境にスワップしたり、別のテスターが同じコードを異なる xml 構成で使用したりするなど、Java コードを変更せずに xml 構成を簡単に交換できます。

xml の実装を直接使用する場合は、ポリモーフィズムの力が失われ、別の実装に交換する必要がある場合は Java コードを変更する必要があります。

PersonDAOImpl は、次のような PersonDAO を実装する必要があります。

public class PersonDAOImpl implements PersonDAO

Xml 構成は、アプリケーション全体で依存性注入またはシングルトン Bean インスタンスにのみ使用され、ポリモーフィズムの保持とは関係ありません。あなたがしなければならないことは、Javaのインターフェース実装に従うことです。

于 2013-02-23T10:44:04.903 に答える
0

PersonDAOImpl のコードはどこにありますか? PersonDAO インターフェイスを実装する必要があります

于 2013-02-23T21:43:45.537 に答える