当前位置: 首页 > 知识库问答 >
问题:

如何使用接口声明DAO变量,但在Spring Framework中放入具体实现?

慕铭
2023-03-14

我正在研究如何将Spring框架与Hibernate集成,对此我有些怀疑。

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

因此,我在其中有一个名为PERDAO的接口,我已经在我的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工作得很好,我的对象正确地保存在我的数据库中,但我有以下架构上的疑问:如果我不使用接口,为什么我有一个接口?

最后,以这种方式,我无法拥有接口并直接使用具体类。。。

我认为,在建筑上,这太糟糕了...

我已尝试更改我的应用程序。java clas并尝试以以下方式使用DAO对象:

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

但不要工作。。。

在本教程中:http://viralpatel.net/blogs/spring3-mvc-hibernate-maven-tutorial-eclipse-example/

还有另一种情况,真正使用接口,在女巫中有一个ContactServiceImpl类,我使用@Autow的注释声明了ContactDAO变量:

@Autowired
private ContactDAO contactDAO;

ContactDAO是一个DAO接口,但Spring会自动连接一个对象,该对象是它的implemtanio ContactDAOImpl(使用@Repository进行注释)

因此,使用**@Autowired注释,在这段代码中,我可以使用接口声明一个变量,但在这个变量中加入对它的具体实现的引用!!!

在我的项目中,我不使用注释bean配置机制,但我使用XML配置机制......但我认为在这种情况下,我也可以做类似的事情......

我在我的项目XML配置文件中声明了我的bean,如下所示:

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

我可以做些什么来声明我的道变量为接口并在其中放入它的具体实现?(仍然使用XML配置)

这是我使用时出现的堆栈跟踪错误:

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

在我的应用程序中。Java测试类

信息:使用DataSource[org.apache.commons.dbcp。BasicDataSource@7363c839]HibernateTransactionManager竞赛的Hibernate SessionFactory恢复:org。springframework。上下文支持ClassPathXmlApplicationContext@591f5ff9:启动日期【Sat-Feb 23 11:42:25 CET 2013】;线程“main”Creato persona1:org中上下文hierarchyException的根。安德烈。我的例子。冬眠Spring。实体Person@23653628JAVAlang.ClassCastException:组织。安德烈。我的例子。冬眠之春。道。PersonDAOImpl$$enhancerbyglib$$d46b3a86不能强制转换到组织。安德烈。我的例子。冬眠之春。道。组织的PersonDAO。安德烈。我的例子。冬眠之春。应用程序。main(应用程序java:27)

Tnx安德里亚

共有2个答案

殳越
2023-03-14

PersondaImpl的代码在哪里?它必须实现PersonDAO接口

羊舌赞
2023-03-14

接口和具体实现的本质是保持多态性。在测试环境中,您可以使用不同的具体实现,但使用相同的接口,而在开发模式中,可以在xml配置中放置另一个实现。您可以轻松地交换xml配置,而无需更改java代码,例如从开发环境交换到测试环境,或者其他测试人员将使用相同的代码,但使用不同的xml配置。

如果要在xml中直接使用实现,那么将失去多态性的能力,如果必须切换到其他实现,则需要更改java代码。

您的个性化DAOImpl必须实现个性化DAO,例如

public class PersonDAOImpl implements PersonDAO

Xml配置仅用于整个应用程序中的依赖项注入或单例bean实例,它与保持多态性无关。您需要做的是遵循java的接口实现。

 类似资料:
  • 问题内容: 这是一个真正的初学者问题(我仍在学习Java基础知识)。 我可以(有点)理解为什么方法将返回而不是,或者为什么它们将接受List参数而不是ArrayList。如果对方法没有影响(即,如果不需要ArrayList中的特殊方法),则这将使该方法更加灵活,并且更易于调用者使用。其他集合类型(例如Set或Map)也是如此。 我不明白的是:创建这样的局部变量似乎是一种惯例: 虽然这种形式的频率较

  • 问题内容: 如何在mysql中声明变量,以便第二个查询可以使用它? 我想写一些像: 问题答案: MySQL中主要有三种类型的变量: 用户定义的变量 (以开头): 您可以访问任何用户定义的变量,而无需对其进行声明或初始化。如果引用的变量尚未初始化,则其值为和字符串类型。 您可以使用或语句来初始化变量: 要么 可以从一组有限的数据类型中为用户变量分配一个值:整数,十进制,浮点数,二进制或非二进制字符串

  • 问题内容: 我有一个Netezza查询,在其中我引用了一系列案例陈述中的几个日期。而不是每次我都想在开始时将一个变量置为一个变量并在整个查询中都使用它时,而不是替换所有这些日期。在SAS中,我会这样做: 问题答案: 不幸的是,Netezza中没有程序SQL扩展,您无法将这样的变量用作SQL语言本身的一部分。纯粹的SQL解决方案将涉及一些麻烦,例如加入CTE并返回该值。但是,NZSQL CLI确实允

  • 我有一个基本接口,并从中扩展了3个接口,和。在对进行了一些业务更改之后,现在与相同,但为了一致性,我不希望仅使用,而不是使用扩展接口。我试着这样做: 然后,ESLint警告我不要使用空接口。如果我不想禁用此规则,是否有方法将声明为与相同的接口?

  • 我需要通过@Autowired注入服务类的具体实现。 服务接口: 实现: 服务中的方法带有@ Transactional注释 现在我想将postServiceImpl注入到我的控制器中——因为我需要使用实现中的一个方法,它不在接口中: 我收到NoSuchBeanDefinitionException并显示以下消息: 没有[(…)类型的合格bean。找到依赖项的PostServiceImpl]:预计

  • 问题内容: 最近有人问我这在python中是什么意思: 我不知道。我以前从未见过。我检查了文档,没有类似的东西。一个人的建议是它是静态类型声明,但是在文档中也绝对没有任何内容。 有了以上,如果我 失败了 如果我可以,并且type(char)的结果是。但是它不能是静态声明,因为我可以并且type(char)变为。 所以我来这里是为了收集许多SO霸主的智慧。这意味着什么? 问题答案: 您正在查看变量的