Как говорили другие ответы, лучший способ сделать это - __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
Надеюсь, это поможет. Это предостережение стоило мне много времени и путаницы при тестировании других представленных решений.
Да, они должны иметь масштабы Singleton
.
Услуги должны быть без гражданства, и, следовательно, им не нужно больше, чем один экземпляр.
Таким образом, определяющим их в области Singleton
, сэкономит время для инземновизации и провода их.
Singleton
- это область применения по умолчанию весной, так что просто оставьте определения бобов, так как они, без явного уточнения атрибута
.
Вы можете прочитать больше о принципах в пружинных документах .
Весна проще в использовании, если вы придерживаетесь с Singleton-Scoped Beans. Singletons - это его «позиция по умолчанию», если вам нравится. Да, он поддерживает другие области (используя SCOPE = «XYZ»
в файле XML), но это делает вещи сложнее использовать и ранит производительность.
По сути, если у вас нет веских причин поступать в противном случае, придерживаться синглтонов.
Вам нужны в основном синглоны. (По умолчанию пружина.) Одиночки должны быть потокобезопасными, так как параллельные запросы будут использовать один и тот же единственный экземпляр. На самом деле, они должны быть полностью апатридами, так как могут быть уничтожены и воссозданы в любой момент.
Если вам нужно следить за состоянием бобов (не следует, это должно быть в базе данных или храниться в запросе), вы получите много экземпляров одного и того же типа бобов, использование памяти увеличится с увеличением количества запросов, при этом с синглтонами у вас все равно будет только один экземпляр.
Даже если вы используете бобы в запросе, они все равно должны быть как минимум потокобезопасными (запросы, приходящие из одного и того же браузера в одно и то же время).