С точки зрения "raison d'etre" аннотация существует как лучшая альтернатива дизайну и архитектуре, чем просто добавление класса со статическими полями.@WebInitParam
- это самодокументируемый подход к параметрам инициализации, который необходим сервлету или классу фильтра, который также доступен через web.xml.Он служит этой цели как для конечных разработчиков, так и для платформы JavaEE в целом.
Подумайте об этом так: в проекте vanilla у вас есть возможность жестко кодировать набор параметров в классе как статические поля или определять те же параметры в файле свойств.Что бы вы выбрали?При каких обстоятельствах?
С чисто функциональной точки зрения, помимо функции , использующей аннотацию для переопределения значений по умолчанию, установленных в web.xml , еще одной важной причиной являетсячто вам иногда потребуется получить эти параметры инициализации от другого компонента в вашем приложении.Использование аннотации существенно увеличивает видимость параметра.Например, в JSF API позволяет извлекать параметры инициализации FacesServlet с помощью:
//get all the parameters
FacesContext.getCurrentInstance().getExternalContext().getInitParameterMap()
//get a specific parameter
FacesContext.getCurrentInstance().getExternalContext().getInitParameter("aParameter");
В JSF-2.3 это становится еще удобнее при следующей инъекции с поддержкой CDI:
@InitParameterMap Map<String,String> servletParameterMap;
Имейте в виду, что, поскольку это CDI, это означает, что эта возможность доступна на всей платформе JavaEE, а не только в веб-приложениях / JSF.
Будет трудно получить параметры инициализации, если доступен только механизмявляется статическим полем в классе сервлетов - вам нужно получить экземпляр фильтра или сервлета, чтобы получить статические поля в нем.
Отдельно можно привести аргумент, что, возможно, следует отдавать предпочтение контекстным параметрам по сравнению с сервлетными, потому что тогда вы получите еще большую гибкость, которая не привязана к какому-либо сервлету.Это отдельный вопрос целиком:)