Как получить программный компонент Osgi с областью действия прототипа (который, как оказалось, также является компонентом Vaadin)

#osgi #vaadin21

#osgi #ваадин21

Вопрос:

Я использую Vaadin 21 в Apache Karaf, контейнере Osgi. Что я хочу сделать :

  • Создайте компонент vaadin, аннотируйте его с помощью @Component(область действия=ScopeService.ПРОТОТИП)
  • В представлении с @Route в документе Vaadin говорится, что мы не можем использовать зависимость от инъекции для получения ссылки на компонент Osgi
  • Чтобы получить ссылку, док говорит использовать :
     ServiceReferencelt;MyComponentgt; reference = ctx.getServiceReference(MyService.class); MyComponent myComponent = ctx.getService(reference);```   
  • У меня проблема, когда я обновляю свой экран, экземпляр MyComponent остается прежним
  • Чтобы избежать этого, я нашел альтернативу :
     ServiceReferencelt;MyComponentgt; reference = ctx.getServiceReference(MyComponent.class);  ServiceObjectslt;MyComponentgt; res = ctx.getServiceObjects(reference);  MyComponent myComponent = res.getService();```     

У кого-нибудь есть лучший способ получить ссылку на мой прототип vaadin и компонент osgi ? Вот мой код (из base-starter-flow-osgi) :

 public class MainView extends VerticalLayout {   public MainView() {    BundleContext ctx = FrameworkUtil.getBundle(MyComponent.class).getBundleContext();  ServiceReferencelt;MyComponentgt; reference = ctx.getServiceReference(MyComponent.class);  ServiceObjectslt;MyComponentgt; res = ctx.getServiceObjects(reference);  prestas = res.getService();   add(myComponent);  } } @Component(service=MyComponent.class, scope=ServiceScope.PROTOTYPE) public class MyComponent extends Div{  private static final long serialVersionUID = -8573895829405499446L;   @Override  protected void onAttach(AttachEvent attachEvent) {  super.onAttach(attachEvent);  add(new Span("Hello World!"));  }   }  

Комментарии:

1. 1) В чем преимущество использования области прототипа по сравнению с простым созданием экземпляра new компонента в вашем случае? 2) В чем проблема с вашим альтернативным решением (почему вы ищете «лучший» способ)?

2. @ollitietavainen спасибо за ваш ответ 1) я хотел бы использовать весь потенциал osgi @Component , который обрабатывает жизненный цикл экземпляров, внедрение зависимостей и т.д. например, если MyComponent использует некоторые службы, здесь я просто аннотирую Reference и использую контекст пакета, чтобы получить ссылку на MyComponent, инициализированную его экземплярами службы. 2) получение экземпляра компонента кажется немного сложным или, по крайней мере, многословным, поэтому мы не решались использовать, как вы сказали, новый экземпляр. Но мы находимся в среде osgi, поэтому мы ищем более легкий и читаемый способ улучшить наш код

3. Возможно, вы могли бы обновить пример микомпонента, чтобы включить внедрение службы, если это ваш вариант использования (постарайтесь уточнить, о чем вы спрашиваете). И по моему скромному мнению, инъекция всегда менее читаема, чем прямая инстанциация.