我學習如何Spring框架與Hibernate整合,我對此有些懷疑。如何申報使用一個接口,但放在它的具體實現在Spring Framework的一個DAO變量?
我有開發工作以及個人的例子,但我不知道這個項目的架構。
所以我在至極名爲的PersonDAO接口我宣佈,我會在我的DAO
然後我就用類創建的具體實現這個接口的PersonDAOImpl了實現的CRUD操作以前的界面。
然後我已創建了以下主要類來測試我的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的工作很好,我的目的是正確地堅持我的數據庫,但我有以下建築的疑問:爲什麼我有一個接口,如果我不使用它?
Finnally,以這種方式,我不能有接口,並直接使用混凝土類...
我認爲,建築風格,這是如此糟糕...
我有嘗試改變我的App.java CLAS,並嘗試使用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接口但春節自動裝配的對象,它是一個istance的是implemtan蒂奧ContactDAOImpl(即使用@Repository annoted)
因此,使用** @自動裝配Autowired註解,在這段代碼我使用的接口可以聲明一個變量,但是把這個變量的引用來具體實現它!
在我的項目,我不使用annotion bean配置機制,但我使用的XML配置機制...但我認爲,在這種情況下,我可以做somenthing喜歡它...
我我的項目XML配置文件,我宣佈我的豆是這樣的:
<bean id="personDAOImpl" class="org.andrea.myexample.HibernateOnSpring.dao.PersonDAOImpl" >
<property name="sessionFactory" ref="sessionFactory" />
</bean>
我能做些什麼來聲明吾道變量爲一個接口,把它的具體實現的呢? (仍在使用XML配置)
這是堆棧跟蹤誤差我有,當我使用:
PersonDAO dao = (PersonDAO) context.getBean("personDAOImpl");
我App.Java測試類
信息:使用數據源[組織Hibernate SessionFactory的HibernateTransactionManager的.apache.commons.dbcp.BasicDataSource @ 7363c839] Contesto recuperato:org[email protected]591f5ff9:startup date [Sat Feb 23 11:42:25 CET 2013];上下文hierarchyException在線程「main」中的根目錄1:[email protected] 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 安德烈
它不工作。它必須工作,如果第一個工作,因爲PersonDAOImpl實現PersonDAO。粘貼異常的完整堆棧跟蹤。 – 2013-02-23 10:38:33
好的,貼在原帖子 – AndreaNobili 2013-02-23 10:45:04
我不明白你不明白。鬆散耦合架構主體?背後的(簡短的)想法是,類包含一個對接口的引用,比如'PersonDAO',並且你*注入*一個通過Spring實現的具體實現(你使用註解'@ Autowired'或者作爲xml中的一個屬性來注入。 – skuntsel 2013-02-23 10:45:15