向ServletContextListener注入依赖项

时间:2013-11-28 11:00:34

标签: java spring hibernate servletcontextlistener

我正在开发一个Web应用程序,我是Spring Hibernate的新手。在那里,我有一个ServletContextListener定期运行一个方法。在那个课程中,我在ReceiptDao课程中调用了一个方法。

下面是ServletContextListener类

public class MailReminder implements ServletContextListener {

    public void contextInitialized(ServletContextEvent arg0) {
    ServletContext servletContext = arg0.getServletContext();
    System.out.println("ServletContextListener started");

    int delay = 1000;
    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask(){
    public void run(){

        ReceiptDao receiptDao=new ReceiptDao();
        receiptDao.listReceipts();
        }
    },delay, 1000*60);
    }


    public void contextDestroyed(ServletContextEvent arg0) {

    ServletContext servletContext = arg0.getServletContext();
    Timer timer = (Timer)servletContext.getAttribute ("timer");
    if (timer != null)
    timer.cancel();
    servletContext.removeAttribute ("timer");
    System.out.println("ServletContextListener destroyed");
    }
    }

以下是ReceiptDao中的方法

 @Autowired
 private SessionFactory sessionFactory;

 @SuppressWarnings("unchecked")
 public List<Receipt> listReceipts() {

    Session session = sessionFactory.openSession();  //line 150
    Criteria crit= session.createCriteria(Receipt.class);
    crit.add(Restrictions.eq("ReceiptId",2 ));
    List<Receipt> receiptlist= crit.list();
    session.close();
    return receiptlist;

    }

它在第150行给出了NullPointerException。我知道它发生是因为我通过Spring非托管类调用此方法。但我不知道如何将我的Spring托管ReceiptDao注入到我的ServletContextListener中。

你能告诉我如何注射吗?请在我的web.xml和spring-config-file.xml中提及我必须做的更改。

1 个答案:

答案 0 :(得分:0)

要创建新类并注入其他类,您需要创建bean。

在您的情况下注入您的收据DAO;你需要如下:

 <beans>
     <bean id="receiptDAO" class="{path}.ReceiptDao" singleton="true"/>

     <bean id="mailReminder" class="{path}.MailReminder" scope="singleton">
       <property name="receiptDAO">
         <ref bean="receiptDAO"/>
      </property>         
    </bean>
  </beans>

在你的班级中,只需创建:

private ReceiptDao receiptDAO;
public getReceiptDAO()
{
  return receiptDAO;
}

你可以自由使用