Я вижу, что вы пытаетесь сделать.
В любой момент вы хотите получить снимок всех User
с в системе. Затем для каждого из них вы хотите, чтобы существовал RequestScoped
TheService
, который затем будет использоваться для каких-либо действий.
Как написано, на самом деле это невозможно с CDI.
Я предполагаю, что вы хотите создать экземпляр TheService
и использовать механизм зависимостей CDI, поскольку TheService
имеет некоторые @Inject
-аннотированные поля? Я просто догадываюсь.
Если это так, вы можете подделать это примерно так:
final Unmanaged<TheService> unmanagedService = new Unmanaged<TheService>(TheService.class);
final UnmanagedInstance<TheService> serviceInstance = unmanagedService.newInstance();
final TheService service = serviceInstance.produce().inject().postConstruct().get();
// Any @Inject-annotated fields in service will now be "filled" if possible; that's
// what the inject() call above does; any @PostConstruct methods it has will have been
// invoked, etc.
// You'll have to manually set its user and age properties:
service.setUser(user.getName());
service.setAge(user.getAge());
service.doSomething();
// The TheService instance is NOT in request scope; *you* are fully in control
// of its lifecycle, so don't forget to dispose it when you're done. You may
// need to put this in a finally block to ensure it happens:
serviceInstance.preDestroy().dispose();
Компоненты CDI имеют «stati c» дизайн. То, что вы хотите сделать, это dynamici c, то есть он изменяется во время выполнения (возможно, служба запросов возвращает совершенно разные User
экземпляры при каждом вызове). Поэтому внедрение полностью управляемого TheService
на самом деле не то, что вы хотите сделать, поскольку вы не можете предсказать, сколько их будет или как они будут построены.
Конструкция Unmanaged
в CDI предназначен для тех случаев, когда вы хотите управлять продолжительностью жизни чего-либо, что в противном случае было бы бином CDI самостоятельно.
Надеюсь, это поможет.