Должны ли классы уровня обслуживания быть синглетонами?

Как говорили другие ответы, лучший способ сделать это - __file__ (снова продемонстрировано ниже). Тем не менее, существует важное предостережение, которое заключается в том, что __file__ НЕ существует, если вы используете модуль самостоятельно (например, __main__).

Например, скажем, у вас есть два файла ( оба из которых находятся на вашем PYTHONPATH):

#/path1/foo.py
import bar
print(bar.__file__)

и

#/path2/bar.py
import os
print(os.getcwd())
print(__file__)

Запуск foo.py даст результат:

/path1        # "import bar" causes the line "print(os.getcwd())" to run
/path2/bar.py # then "print(__file__)" runs
/path2/bar.py # then the import statement finishes and "print(bar.__file__)" runs

ОДНАКО если вы попытаетесь запустить bar.py самостоятельно, вы получите:

/path2                              # "print(os.getcwd())" still works fine
Traceback (most recent call last):  # but __file__ doesn't exist if bar.py is running as main
  File "/path2/bar.py", line 3, in <module>
    print(__file__)
NameError: name '__file__' is not defined 

Надеюсь, это поможет. Это предостережение стоило мне много времени и путаницы при тестировании других представленных решений.

24
задан BalusC 26 November 2016 в 13:07
поделиться

3 ответа

Да, они должны иметь масштабы Singleton . Услуги должны быть без гражданства, и, следовательно, им не нужно больше, чем один экземпляр.

Таким образом, определяющим их в области Singleton , сэкономит время для инземновизации и провода их.

Singleton - это область применения по умолчанию весной, так что просто оставьте определения бобов, так как они, без явного уточнения атрибута .

Вы можете прочитать больше о принципах в пружинных документах .

39
ответ дан 28 November 2019 в 05:22
поделиться

Весна проще в использовании, если вы придерживаетесь с Singleton-Scoped Beans. Singletons - это его «позиция по умолчанию», если вам нравится. Да, он поддерживает другие области (используя SCOPE = «XYZ» в файле XML), но это делает вещи сложнее использовать и ранит производительность.

По сути, если у вас нет веских причин поступать в противном случае, придерживаться синглтонов.

2
ответ дан 28 November 2019 в 05:22
поделиться

Вам нужны в основном синглоны. (По умолчанию пружина.) Одиночки должны быть потокобезопасными, так как параллельные запросы будут использовать один и тот же единственный экземпляр. На самом деле, они должны быть полностью апатридами, так как могут быть уничтожены и воссозданы в любой момент.

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

Даже если вы используете бобы в запросе, они все равно должны быть как минимум потокобезопасными (запросы, приходящие из одного и того же браузера в одно и то же время).

1
ответ дан 28 November 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: