然后在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; }