【问题标题】:spring singleton object state弹簧单例对象状态
【发布时间】:2013-07-25 09:45:17
【问题描述】:

这里我对 spring 单例对象有一个疑问。

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 上下文中没有相同的状态!!

提前致谢

【问题讨论】:

  • Spring 应用程序上下文永远不会被引导。

标签: java spring


【解决方案1】:

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

这是一个通过 xml 引导的示例:

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

【讨论】:

  • 我在应用程序上下文中为 applicationContext.xml 文件进行了引导。像_springContext = new GenericApplicationContext(); XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(_springContext); xmlReader.loadBeanDefinitions(new ClassPathResource("resources/applicationContext.xml")); _springContext.refresh(); 和该文件已导入Test.xml 文件。它不是真正意义上的引导程序吗?
  • @BMT 引导代码需要在 main 方法中。你只是省略了吗?
  • 查看您的配置会很有帮助。来自 spring 文档 Spring 单例的范围最好按照容器和 bean 来描述。您遇到的问题可能只是配置问题。默认情况下,bean 将是单例的,除非 bean 具有父 bean 定义,在这种情况下它将继承父 bean 的范围。 [1]:static.springsource.org/spring/docs/3.0.0.M3/reference/html/…
  • @KevinBowersox 谢谢,映射有误。我没有看到有定义为prototype..so 的范围很明显给出了它的新实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多