2013-07-25 3 views
2

Здесь у меня есть одно сомнение с весной singleton object.spring singleton состояние объекта

Spring will create atleast one object per bean definition depending on the scope. for singleton scope, you will get only one object per bean definiton.

Как весенний контекст предоставит нам экземпляр singleton, то почему я не могу поделиться с ним тем же самым сеансом.

Код ниже дают ошибку:

Throw null pointer error. org.hibernate.TransactionException: Transaction not successfully started

при попытке получить доступ к той же сессии экземпляра. даже экземпляр сеанса имеет значение null.

В основной метод

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(); 
} 

Если я начинаю сеанс снова или передать один экземпляр сеанса в методе, то он работает нормально, но я не понимаю, почему он не работает. экземпляр singleton не имеет такого же состояния в контексте весны !!

Заранее спасибо

+2

контекст приложения весна никогда не бутстрапированная. –

ответ

1

Для использования Spring вы должны грузиться контейнер инъекции depenedency. Контейнер может указывать на файл xml, определяющий ваши компоненты или класс, используя конфигурацию Springs Java. Как только контейнер загружается, он управляет всеми вашими бобами как одиночные. Код, который вы предоставили, использует статический метод для класса ApplicationContext, поэтому он никогда не имеет фактического дескриптора экземпляра ApplicationContext, что означает, что в нем не определены никакие бобы.

Вот пример самозагрузки с помощью XML:

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

Я сделал bootstrap для файла applicationContext.xml в контексте приложения. например '_springContext = new GenericApplicationContext(); \t \t XmlBeanDefinitionReader xmlReader = новый XmlBeanDefinitionReader (_springContext); \t \t xmlReader.loadBeanDefinitions (новый ClassPathResource ("resources/applicationContext.xml")); \t \t _springContext.refresh(); ' И файл имеет импорт файла' Test.xml'. это не бутстрап в реальном времени? – iMBMT

+0

@BMT, что код начальной загрузки должен быть в основном методе. Вы просто опустили его? –

+0

Было бы полезно увидеть ваш конфиг. С весны docs Сфера применения весеннего синглтона лучше всего описывается как контейнер и фасоль. Проблема, с которой вы сталкиваетесь, может быть просто элементом конфигурации. По умолчанию, bean будет singleton, если у компонента bean нет родительского определения компонента, и в этом случае он наследует область родителя. [1]: http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s04.html –

Смежные вопросы