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 アンドレア