按照Appfuse2.1的文档http://java.net/
projects/appfuse/downloads/download/appfuse-documentation-2.1.0.pdf如果你的DAO只是普通的CRUD(所需操作全部包含在GenericDAO中),则你只需要写好DAO对应的Entity即可。然后在
hibernate.hbm.xml里注册一下你写的Entity(不管你是不是需要复杂的DAO,你都需要把你的Entity注册到这个文件里)。
然后在src/main/webapp/WEB-INF/applicationContext.xml里注册一个DAO如下:
</beans>
<bean id="personDao" class="org.appfuse.dao.hibernate.GenericDaoHibernate">
<constructor-arg value="org.appfuse.tutorial.model.Person"/>
</bean>
</beans>
在需要调用这个DAO的地方这样写即可:
private GenericDao<Person, Long> personDao;
@Autowired
public void setPersonDao(GenericDao<Person, Long> personDao) {
this.personDao = personDao;
}
针对这样DAO,
你需要用它的
Service(Appfuse里Service叫做Manager)的时候,在src/main/webapp/WEB-INF/applicationContext.xml里注册一个Manager,如下:
<beans>
<bean id="personManager" class="org.appfuse.service.impl.GenericManagerImpl">
<constructor-arg>
<bean class="org.appfuse.dao.hibernate.GenericDaoHibernate" autowire="byType">
<constructor-arg value="org.appfuse.tutorial.model.Person"/>
</bean>
</constructor-arg>
</bean>
</beans>
在需要调用这个Service的地方,这样写:
private GenericManager<Person, Long> personManager;
public void setPersonManager(GenericManager<Person, Long> personManager) {
this.personManager = personManager;
}
以上做法是非常简便的。但它所提供的操作仅限于GenericDao里的一些常用操作。
如果你的Service里要用多个Service或者其他的DAO,你就需要做一个复杂的Manager。这个复杂的Manager要继承GenericManager。GenericManager有
泛型,需要指明Entity的class和key的class。例如上面的GenericDao<Person, Long>。
这时,如果你的DAO仍然要用一个普通的GenericDao,你就不需要上面那样复杂的Manager注册过程了。直接注册一个无参的Manager即可,例如:
<bean id="invoiceManager" class="org.appfuse.service.impl.InvoiceManagerImpl"/>
这个注册说明你做了InvoiceManager的Interface和这个Interface的实现类InvoiceManagerImpl。因为这个类继承了GenericManager,并在声明中给出了泛型,所以在注册的时候不需要参数了。
在这个Manager的实现类里,也无需像Appfuse2.1文档里说的那样做一个什么构造方法注入特殊DAO了。
在这个Manager里,如果你还需要其他的Service或者DAO,就像上面
例子中说的那样,声明一个变量,并给这个变量写一个setter即可。
但是,如果你引用的是其他的Service(或你自己写的复杂的DAO),记住不要加@Autowired
注解。如果引用的是GenericDao,则需要加注解。
=====June 7th, 2012=====
如果不是复杂Dao,不要在非本实体的Manager里通过Autowired引入。因为这时候不论用什么机制,都不能初始化这个Dao。
可以对要引用的其他Dao先做一个Manager。然后在本实体的Manager里引用新做的那个Manager。这时,Spring会在实例化Manager的时候实例化它里面的Dao。
如果非要直接引用其他实体的GenericDao,可以考虑用注入这个Dao的方式,例如:
<bean id="invoiceManager" class="org.appfuse.service.impl.InvoiceManagerImpl">
<constructor-arg>
<bean class="org.appfuse.dao.hibernate.GenericDaoHibernate" autowire="byType">
<constructor-arg value="org.appfuse.model.Invoice"/>
</bean>
</constructor-arg>
<property name="invoiceApplDao">
<bean class="org.appfuse.dao.hibernate.GenericDaoHibernate" autowire="byType">
<constructor-arg value="org.appfuse.model.InvoiceAppl"/>
</bean>
</property>
</bean>
private GenericDao<InvoiceAppl, Long> invoiceApplDao;
public void setInvoiceApplDao(GenericDao<InvoiceAppl, Long> invoiceApplDao){
this.invoiceApplDao = invoiceApplDao;
}
- appfuse-documentation-2.1.0.pdf (2.9 MB)
- 下载次数: 11