我正在研究如何将 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安德烈亚