弹簧单身对象状态

时间:2013-07-25 09:45:18

标签: java spring

这里我对 spring singleton object 有一个疑问。

  

Spring将根据范围为每个bean定义创建至少一个对象。   对于单例范围,每个bean定义只能获得一个对象。

由于spring上下文为我们提供了单例实例,那么为什么我无法共享它的相同会话。

以下代码给出错误:

  

抛出空指针错误。   org.hibernate.TransactionException:事务未成功启动

尝试访问同一实例会话时

。偶数会话实例为空。

主要方法

public static void main(String[] args)
{
  TestDao dao =  (TestDao) ApplicationContext.getInstance().getBean(DaoType.TestDao.toString());
  dao.startOperation();
  for(Test test:testList)
  {
     saveIsBean(test,true)
  }
  dao.endOperation();
}

如果会话打开,则此方法保存数据,然后重复使用它。

private void saveIsBean(IsBean isBean,boolean isSessionAlreadyOpen) throws NTException
 {
 TestDao dao =  (TestDao) ApplicationContext.getInstance().getBean(DaoType.TestDao.toString());
  if(isSessionAlreadyOpen)
 {
 //dao.startOperation(); If I start session again then it works.
 dao.getSession().saveOrUpdate(isBean); //Throw null pointer error. org.hibernate.TransactionException: Transaction not successfully started
  }
 else
 {
 dao.saveOrUpdate(isBean);
  }
 } 
public void startOperation() throws HibernateException {
 session = HibernateFactory.openSession();
 transaction = session.beginTransaction();
 }

如果我再次启动会话或在方法中传递相同的会话实例,那么它工作正常,但我不明白为什么它不起作用。 单例实例在spring上下文中没有相同的状态!!

提前致谢

1 个答案:

答案 0 :(得分:1)

要使用Spring,您必须引导依赖注入容器。容器可以指向使用Springs Java配置定义bean或类的xml文件。一旦容器被引导,它就会将所有bean作为单例进行管理。您提供的代码在ApplicationContext类上使用静态方法,因此它永远不会有ApplicationContext实例的实际句柄,这意味着没有在其中定义bean。

以下是通过xml引导的示例:

// create and configure beans
ApplicationContext context =
    new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"});