Ниже приведен код, который я использую для вставки контекстных компонентов CDI в объект без контекста.Правильный способ ввода CDI Контекстные компоненты в существующий неконтекстный компонент?
// My controller is Non-contextual bean
public class MyController extends Controller {
@Inject
ModelBinder modelBinder;
@Inject
ApplicationConfig applicationConfig;
private CreationalContext<Controller> creationalContext;
public void setCreationalContext(CreationalContext<Controller> creationalContext) {
this.creationalContext = creationalContext;
}
public CreationalContext<Controller> getCreationalContext() {
return creationalContext;
}
// Other fields
}
Код для Инициализировать MyController
// Create Non-contextual bean
MyController controller = new MyController();
AnnotatedType<?> at = beanManager.createAnnotatedType(controller.getClass());
InjectionTarget<Controller> it = (InjectionTarget<Controller>)beanManager.createInjectionTarget(at);
CreationalContext<Controller> creationalContext = beanManager.createCreationalContext(null);
// Perform inject
it.inject(controller, creationalContext);
// Store creationalContext related
controller.setCreationalContext(creationalContext);
Код для Destroy MyController
// controller is instance of MyController
AnnotatedType<?> at = beanManager.createAnnotatedType(controller.getClass());
InjectionTarget<Controller> it = (InjectionTarget<Controller>)beanManager.createInjectionTarget(at);
it.dispose(controller);
controller.getCreationalContext().release();
Сегодня лидер Моя команда обсуждали со мной, и он сказал: Потому что ModelBinder, ApplicationConfig являются областями видимости приложения CDI, поэтому мне не нужно жет код уничтожить контроллер и код, он предложил, как показано ниже:
// New MyController
public class MyController extends Controller {
@Inject
ModelBinder modelBinder;
@Inject
ApplicationConfig applicationConfig;
// Do not need to store creationalContext
//private CreationalContext<Controller> creationalContext;
//public void setCreationalContext(CreationalContext<Controller> creationalContext) {
// this.creationalContext = creationalContext;
//}
//public CreationalContext<Controller> getCreationalContext() {
// return creationalContext;
//}
// Other fields
}
Новый код для инициализации MyController
// Create Non-contextual bean
MyController controller = new MyController();
AnnotatedType<?> at = beanManager.createAnnotatedType(controller.getClass());
InjectionTarget<Controller> it = (InjectionTarget<Controller>)beanManager.createInjectionTarget(at);
CreationalContext<Controller> creationalContext = beanManager.createCreationalContext(null);
// Perform inject
it.inject(controller, creationalContext);
// Do not need to store creationalContext related
// controller.setCreationalContext(creationalContext);
Новый код Разрушить MyController
// No need code to destroy the controller
Любой есть идеи? Большое спасибо!
Я должен спросить, почему вы даже создаете экземпляр контроллера самостоятельно? Почему бы не использовать контейнер CDI для получения ссылок на него? –