Scout Bean Manager: registerClass(..) or registerBean(..)

梦想的初衷 提交于 2019-12-24 16:34:33

问题


In our project we have following modules scout.client, scout.server, scout.shared and backend.

backend has no dependencies to scout.server and scout.shared, but scout.server has dependencies to backend.

Inside the backend project we have all business logic and calling all outside services.

We use the Scout Bean Manager to manage the instances of the Backend-Services in our scout.server:

BEANS.getBeanManager().registerClass(CarService.class);
BEANS.getBeanManager().registerClass(PartnerService.class);

Both, CarService.class and PartnerService.class are in the backend.

Is this registration correct? Or should I register the classes using the registerBean(..) method instead of registerClass(..)?


Question derived from an other question asked by @marko-zadravec


回答1:


As explained in the registerClass(..) JavaDoc, if you do:

public class RegisterBeansListener implements IPlatformListener {
  @Override
  public void stateChanged(PlatformEvent event) {
    if (event.getState() == IPlatform.State.BeanManagerPrepared) {
      // register the class directly:
      BEANS.getBeanManager().registerClass(BeanSingletonClass.class);
    }
  }
}

This is the same as:

public class RegisterBeansListener implements IPlatformListener {
  @Override
  public void stateChanged(PlatformEvent event) {
    if (event.getState() == IPlatform.State.BeanManagerPrepared) {
      // register with meta information
      BeanMetaData beanData = new BeanMetaData(PartnerService.class);
      BEANS.getBeanManager().registerBean(beanData);
    }
  }
}

Meaning that you will get a new instance of the PartnerService each time you call BEANS.get(IPartnerService.class). (see Bean Scopes in the Scout Docs).

If you want your bean to have only one instance for your entire application you should register it like that:

public class RegisterBeansListener implements IPlatformListener {
  @Override
  public void stateChanged(PlatformEvent event) {
    if (event.getState() == IPlatform.State.BeanManagerPrepared) {
      // register with meta information
      BeanMetaData beanData = new BeanMetaData(PartnerService.class)
          .withApplicationScoped(true);
      BEANS.getBeanManager().registerBean(beanData);
    }
  }
}

I recommend setting a specific Order like in this answer only for test purpose.



来源:https://stackoverflow.com/questions/36164077/scout-bean-manager-registerclass-or-registerbean

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!