Давайте начнем с нескольких замечаний ...
и он вообще не может обрабатывать параметры конструктора
Неверно.Это называется инжекция в конструктор . Единственное ограничение заключается в том, что все параметры должны быть разрешаемыми компонентами CDI.
@Inject
public Foo(Bar bar) { // -> CDI will attempt to inject Bar
// constructor logic
}
CDI / Weld не вводит зависимости и не запускает перехватчики на созданных объектахс новым
Да, не по умолчанию.Но это достижимо через BeanManager.createInjectionTarget(...).inject(...)
Это не простой способ конвертировать существующее приложение!
ПРИМЕЧАНИЕ: приведенный выше код будет включать только инъекцию.Не перехват.Для этого, возможно, потребуется использовать InterceptionFactory
.Вам не нужно ни то, ни другое для вашей проблемы.
CDI поддерживает программное создание bean-компонентов ...
То, что вы описали с помощью своего кода (Instance<T>
):не создание, а динамический / программный поиск .Он придерживается тех же правил разрешения, что и @Inject
, что позволяет вам сделать его динамичным, а не каменным.Если вы говорите о создании, вы можете иметь в виду методы-производители ?
Теперь, к вашей проблеме ... Если я правильно понял, единственная проблема в том, что конструктор Encryptor
имеетпараметры.Что ж, тогда вам нужно убедиться, что эти параметры могут быть введены каким-либо образом.Поскольку они все три типа String
, вам нужно будет обернуть их в некоторые bean-компоненты или использовать квалификаторы, чтобы типобезопасное разрешение не взорвалось с неоднозначным разрешением, если у вас есть несколько bean-компонентов типа String
.
Вот как будет выглядеть конструктор с решением на основе квалификатора.@Output
, @Input
и @Key
- все квалификаторы :
@Inject
public Encryptor (@Input String inputFile, @Output String outputFile, @Key String key){...}
Вот пример одного из этих классификаторов:
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface Key {}
Инаконец, вам нужно создать бины String
, которые вы можете сделать с помощью методов производителя, упомянутых выше.Вот один из них (за исключением логики для получения этого значения, поскольку я не могу знать, как вы это делаете):
@Produces
@Key
public String produceKeyString() {
// CDI will invoke this method in order to create bean of type String with qual. @Key
String key = new String("safeKey") // replace with your logic to get the value
return key;
}