0

我正在研究如何将 Spring Framework 与 Hibernate 集成,对此我有一些疑问。

我开发了一个运行良好的个人示例,但我不确定该项目的架构。

所以我有一个名为PersonDAO的接口,我已经在我的 DAO 中声明了 CRUD 操作

然后我通过实现前一个接口的类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 测试类中

信息:使用 Hibernate SessionFactory 的数据源 [org.apache.commons.dbcp.BasicDataSource@7363c839] 进行 HibernateTransactionManager Contesto recuperato:org.springframework.context.support.ClassPathXmlApplicationContext@591f5ff9:启动日期 [2013 年 2 月 23 日星期六 11:42:25 CET ]; 线程“main”Creato persona1 中的上下文 hierarchyException 的根:org.andrea.myexample.HibernateOnSpring.entity.Person@23653628 java.lang.ClassCastException:org.andrea.myexample.HibernateOnSpring.dao.PersonDAOImpl$$EnhancerByCGLIB$$d46b3a86 不能投射到 org.andrea.myexample.HibernateOnSpring.App.main(App.java:27) 的 org.andrea.myexample.HibernateOnSpring.dao.PersonDAO

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 回答