Весенний доступ к компоненту

#spring

#весенний

Вопрос:

Основной компонент в моем классе имеет объект, создание которого чрезвычайно дорого и, следовательно, должно быть создано только один раз, а затем передано различным утилитам, которым это может потребоваться.

 public class DaemonBean implements InitializingBean
{
   ReallyExpensiveToCreate obj;

   public ReallyExpensiveToCreate getReallyExpensive() { return obj; }

   @Override
   public void afterPropertiesSet()
   {
       //initialize and build ReallyExpensiveToCreate
   }
}
 

Этот объект требуется классу Util, который состоит из набора статических функций.

 public class Util
{
  public static ReallyExpensiveToCreate objRef = getReallyExpensiveObj();

  private ReallyExpensiveToCreate getReallyExpensiveObj()
  {
     //Get Daemon obj from Spring and call daemonObj.getReallyExpensive();
  }

  public void func1() { //Use objRef in logic }
}
 

Как мне получить объект демона из Spring. Я не уверен, какой код вызывать, чтобы иметь возможность получить ссылку на объект демона. Я видел фрагменты кода, где использовался ApplicationContext, но я не уверен, как это будет использоваться.

Ответ №1:

Вы ищете шаблон Service-locator,

Реализация весной

Вы можете зарегистрироваться ApplicationContextAware , получить ссылку на ApplicationContext bean и статически обслуживать его

 public class ApplicationContextUtils implements ApplicationContextAware {
 private static ApplicationContext ctx;

 private static final String USER_SERVICE = "userServiceBean";

  @Override
  public void setApplicationContext(ApplicationContext appContext)
      throws BeansException {
    ctx = appContext;

  }

  public static ApplicationContext getApplicationContext() {
    return ctx;
  }

  public static UserService getUserService(){return ctx.getBean(USER_SERVICE);}

}
 

Ответ №2:

 public class Util {

    private static ReallyExpensiveToCreate objRef;

    public void objectFunction() {
        objRef.doSomething();
    }

    public static void staticFunction() {
        objRef.doSomething();
    }

    @Autowired
    public void setReallyExpensiveBeanToCreate(DaemonBean daemonBean) {
        Util.objRef = daemonBean.getReallyExpensive();
    }
}