Когда вы начинаете играть с фабриками и «настоящим» кодом Java POJO, вам в основном нужно полагаться на JNDI.
Внедрение зависимостей работает только на управляемых компонентах сервера EJB, и это в основном сервлеты и EJB.
Когда вы говорите об общем коде Java, который хочет ссылаться на EJB, им нужно самим искать ресурсы через JNDI.
В этом случае лучше всего написать класс поиска оболочки, заполненный статическими функциями, для выполнения поиска JNDI, а не вызывать JNDI непосредственно в каждой реализации. А затем используйте это в своих реализациях.
Это просто общее правило.
Теперь, для вашего конкретного случая, рассмотрим это.
У вас есть:
static {
PROCESSORS.put(CredentialsType.CSV, new CSVCredentialsProcessor());
}
Это ничем не отличается от:
static {
PROCESSORS.put(CredentialsType.CSV, "java:comp/env/ejb/CSVCredentialProcessorSessionBean");
}
Затем в вашем коде getProcessor ():
Context c = new InitialContext();
return (CredentialsProcessor) c.lookup(PROCESSORS.get(type));
Видите ли, в основном код идентичен, и ваш заводской интерфейс такой же, как у клиентов.
Вы должны «жестко кодировать» ключ поиска JNDI, но вы все равно «жестко кодируете» имена классов, так как это отличается?
Существует некоторая потенциальная проблема переносимости между контейнерами, в которой всем, похоже, нравится использовать разные идентификаторы JNDI для имен бинов. Большая часть этого может быть изменена при развертывании, но если нет, то вы можете вытащить эти ключи в файл конфигурации или что-то еще.
В Java EE 6 есть гарантированные переносимые имена. Если вы сегодня не переносите контейнеры, тогда вообще не беспокойтесь об этом.
Так что, по сути, это вообще не отключение.