2013-02-23 40 views
0

我學習如何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 安德烈

+0

它不工作。它必須工作,如果第一個工作,因爲PersonDAOImpl實現PersonDAO。粘貼異常的完整堆棧跟蹤。 – 2013-02-23 10:38:33

+0

好的,貼在原帖子 – AndreaNobili 2013-02-23 10:45:04

+0

我不明白你不明白。鬆散耦合架構主體?背後的(簡短的)想法是,類包含一個對接口的引用,比如'PersonDAO',並且你*注入*一個通過Spring實現的具體實現(你使用註解'@ Autowired'或者作爲xml中的一個屬性來注入。 – skuntsel 2013-02-23 10:45:15

回答

1

的本質接口和具體實現是保持多態。在測試環境中,您可以使用不同的具體實現,但使用相同的界面,而在開發模式下,可以將另一個實現放入xml配置中。它很容易讓你交換XML配置,而不用像更換開發到測試環境那樣改變Java代碼,或者另一個測試者使用相同的代碼,但使用不同的XML配置。

如果您要直接使用xml中的實現,那麼您將失去多態性的力量,並且如果必須交換到不同的實現,則需要更改java代碼。

你PersonDAOImpl必須實現的PersonDAO,如

public class PersonDAOImpl implements PersonDAO 

xml配置是僅面向應用的依賴注入或單bean實例使用,它沒有任何與保護多態性。你需要做的是遵循java的接口實現。

0

PersonDAOImpl的代碼在哪裏?它必須實現PersonDAO接口

相關問題