При создании экземпляра Logger в контроллере Spring есть ли причина объявлять его как статический финал ? Регистратор не используется вне MyController.class. Я видел оба примера в использовании, но не понимаю, почему я должен использовать тот или другой.
private Logger logger = LoggerFactory.getLogger(MyController.class);
vs
private static final Logger logger = LoggerFactory.getLogger(MyController.class);
Лично я использую
private final Logger logger = LoggerFactory.getLogger(this.getClass());
Основным преимуществом этого является то, что я могу вырезать и вставлять это в новые классы без необходимости менять имя класса.
Относительно того, должны ли они быть статическими, см. Должны ли члены Logger класса быть объявлены как статические? , с сайта slf4j, где написано:
Мы привыкли к Рекомендовать, чтобы члены регистраторов объявлялись как переменные экземпляра вместо статических. После дальнейшего анализа мы больше не рекомендуем один подход над другим.
Взято с этой страницы:
Члены статического регистратора стоят одну ссылку на переменную для всех экземпляров класса, тогда как член регистратора экземпляров будет стоить ссылку на переменную для каждого экземпляра класса. Для простых классов, создаваемых тысячи раз, может быть заметная разница.
Однако более поздние системы ведения журнала, например, log4j или logback, поддерживают отдельный контекст средства ведения журнала для каждого приложения, работающего на сервере приложений. Таким образом, даже если на сервере развернута одна копия log4j.jar или logback-classic.jar, система ведения журналов сможет различать приложения и предлагать отдельную среду ведения журналов для каждого приложения.
Более конкретно, каждый раз, когда регистратор извлекается путем вызова метода LoggerFactory.getLogger (), базовая система журналирования возвращает экземпляр, подходящий для текущего приложения. Обратите внимание, что в том же приложении, получающем регистратор по заданному имени, всегда будет возвращаться один и тот же регистратор. Для данного имени другой регистратор будет возвращен только для разных приложений.
Если регистратор статический, то он будет извлечен только один раз, когда класс хостинга будет загружен в память. Если класс хостинга используется только в одном приложении, беспокоиться не о чем. Однако, если класс хостинга совместно используется несколькими приложениями, то все экземпляры разделяемого класса войдут в контекст приложения, которое произошло при первой загрузке разделяемого класса в память - вряд ли поведение, ожидаемое пользователем.
Подробнее см. На этой странице.
Да; так что для класса есть только один регистратор, а не один на экземпляр.
В любом случае, это приватно, поэтому использование его вне класса не имеет к этому никакого отношения - это не то, что static final
делает.