Весна создает новые объекты, но не должна - PullRequest
0 голосов
/ 03 мая 2011

У меня возникла следующая проблема со Spring: я ожидал, что синглтоны будут созданы один раз, а затем на них будут ссылаться из кеша Spring.Но, похоже, это не так.В моем файле beans.xml есть следующие строки:

<bean id="Cache" class="java.util.HashMap" scope="singleton" >
</bean>

, на которые ссылаются ниже, например:

<bean id="ManuallyCachingDAO" class="blah"
scope="singleton" init-method="init" destroy-method="destroy">
    <property name="cache" ref="Cache"></property>
    ...

и в ManuallyCachingDAO код:

public Object get(int id) {
    Object o = cache.get(id);
    if (o != null) {
        return o;
    }
    // ... code for retrieving the object from the DB
}

но HashMap иногда очищается таинственным образом!То есть я не думаю, что это на самом деле опустошено.Я думаю, что он просто отбрасывается и создается заново, когда я ссылаюсь на ManuallyCachingDAO в другом классе.

Не могли бы вы рассказать мне, как решить эту проблему?

РЕДАКТИРОВАТЬ: Подсказка Робина: я делаю следующее, чтобы получить бины во многих классах (хотя не во всех):

ClassPathResource blah = etc.; 
XmlBeanFactory xbf = new XmlBeanFactory(blah); 
...
xbf.getBean("Cache");

... сейчас я делаю это (даже для многих других бобов) ... это очень глупая или очень плохая идея или и то и другое?Я думаю, что сейчас мне приходит в голову то, что я делаю неправильно ... До сих пор я просто подозревал, что все XmlBeanFactories каким-то образом захватывали одни и те же ресурсы, которые, возможно, действительно были очень глупыми, или могли сказать мне, что правильно?

Ответы [ 3 ]

2 голосов
/ 03 мая 2011

Возможно, параллелизм портит вашу карту Вы не хотите использовать HashMap как синглтон, так как он не безопасен для потоков. Попробуйте вместо этого ConcurrentHashMap .

2 голосов
/ 03 мая 2011

Я сомневаюсь, что Spring создает новые HashMaps.Ваша конфигурация выглядит хорошо.Я почти уверен, что в вашей логике что-то не так.

В части, отмеченной

// ... code for retrieving the object from the DB

, вы действительно записываете полученные значения на карту?

1 голос
/ 03 мая 2011

Конфигурация выглядит отлично, и Spring хорошо протестирован в этом отношении, поэтому я не думаю, что там будут какие-то сюрпризы.

Вы бы случайно не создавали контекст Spring каждый раз, когда выпытаются получить доступ к бобам?Тем самым все воссоздаем повторно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...