想学学spring的注解,但是dao类继承HibernateDaoSupport后报错,需要sessionFactory或者hibernateTemplet,怎么解决呢?
spring配置<!-- 定义数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql://localhost:3306/test"/>
  <property name="username" value="root"/>
  <property name="password" value="root"/>
</bean>
  
<!-- 定义sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  <!-- 注入数据源 -->
  <property name="dataSource" ref="dataSource"/>
  <!-- 设置hibernate属性 -->
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">
    org.hibernate.dialect.MySQLDialect
    </prop>
    <prop key="hibernate.show_sql">true</prop>
   </props>
  </property>
  <!-- 读取指定目录下的hibernate映射文件 -->
  <property name="mappingDirectoryLocations">
  <list>
  <value>classpath:/com.ssh.onlinetest.*.model</value>
  </list>
  </property>
</bean>
  
<!-- 使用hibernateTemplate -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>

<!-- 定义基于hibernate的事物管理器 -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory"/>
</bean>

   <!-- 使用annotation定义事务 -->   
<tx:annotation-driven transaction-manager="txManager" />
    
  <!-- 使用注解,在beans标签中添加context命名空间及其对应的schemaLocation -->
  <context:annotation-config/>
  <context:component-scan base-package="com.ssh.onlinetest.*"/>

<!-- 定义事物切面 -->
<aop:config>
<aop:pointcut expression="execution(* com.ailk.tangqiang3..*.*(..))" id="txPointCut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>
 
<!-- 定义事物建议,即事物处理逻辑 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="mod*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
dao类定义:@Component("userDAO")
public class UserDAOImpl extends HibernateDaoSupport implements UserDAO {

解决方案 »

  1.   

    在你的UserDAOImpl中加上
    @Resource(name="sessionFactory")
    public void setSuperSessionFactory(SessionFactory sessionFactory) {
    super.setSessionFactory(sessionFactory);
    }
      

  2.   

    只有这一种方法吗?能不能在配置文件中配置?要是这样的话,只能每个HibernateDaoSupport 的实现类都要加这个方法,不太好,或者写个父类来继承HibernateDaoSupport,但还是觉得比较别扭。
      

  3.   

    恩,实际开发中大多都会写个BaseDao什么的继承HibernateDaoSupport,然后封装一些常用的方法,这样每次继承BaseDao就行了,不用每次都去注入sessionFactory
      

  4.   

    @Component//spring通用注解(controller,service,还有一个r开头的,叫什么来着忘记了)
    public class BaseDao extends HibernateDaoSupport{
        private   SessionFactory sessionFactory;
        //set,get方法
        //然后把这个类要么使用spring的注解标识为一个bean组件,或者将这个BaseDao配置在xml文件里,以后每次直接继承这个类就okay了,不会空指针的。
       public Object findById(){}//
      public Page findByPage(){}//封装一些常用的工具类
    }
      

  5.   

    使用配置的话Dao都要注入HibernateTemplate,你看写个类给注入hibernateTemplate,然后HibernateDaoSupport继承该类试下。
      

  6.   

    这明显不行啊,难道你还去改spring的源码?
    结贴了,这一块已经弄好了。谢谢各位的回答。