Как настроить Spring-ioc зависимости Injection в личном порядке? - PullRequest
0 голосов
/ 14 мая 2019

В настоящее время я работаю над веб-приложением, использующим Angular 7 для внешнего интерфейса, подпружиненную загрузку для внутреннего (в котором я разрабатываю полноценный веб-сервис). Я использую аннотацию @Autowired, чтобы внедрить мои сервисы друг в друга и в мой контроллер покоя. Проблема в том, что в некоторых моих службах есть некоторые атрибуты, которые становятся общими, когда внедрение выполняется. Как мне это предотвратить?

import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;

@Service
public class ServiceA {
   private boolean test;
   public ServiceA (){
     test = true;
   }
   public changeValues(){
     test = false;
   }
}

@Service
public class ServiceB {
   @Autowired
   private ServiceA serivceA;
   public void method1() {
     serviceA.changeValues();
   }
}

@Service
public class ServiceC {
   @Autowired
   private ServiceA serivceA;
   public void method2(){
      if(serviceA.getTest()){
        doSomethingNeeded();
      }
   } 
}

public class Application{
  @Autowired
  private ServiceB b;
  @Autowired
  private ServiceC c;

  public static void main(String[] args) {
    b.method1();
    c.method2();
  }
}

В этом случае метод doSomethingNeeded() в ServiceC не сможет быть выполнен, поскольку ресурсный тест `1006 * совместно используется как ServiceB, так и ServiceC. Как мне предотвратить Это?

P.S. В моем случае инъекции зависимостей слишком сложны для применения каких-либо модификаций к сервисам, поэтому мне нужен способ настроить spring-ioc внедрение зависимостей таким образом, чтобы создавать экземпляры личных атрибутов для каждого сеанса клиента.

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Вам просто нужно изменить область действия ServiceA на прототип, добавив @Scope(scopeName = "prototype"):

@Scope(scopeName = "prototype")
@Service
public class ServiceA {

}

Затем, когда создаются экземпляры ServiceB и ServiceC, будут созданы разделенные ServiceA иВнедрить в них.

PS Обратите внимание, что новый экземпляр прототипа bean-компонента будет создан только во время ServiceB и ServiceC.Это не означает, что новый экземпляр компонента-прототипа всегда будет создаваться при каждом обращении к ним.Вам нужно использовать одну из этих техник , если вы хотите такого поведения.

0 голосов
/ 14 мая 2019

Spring Beans по умолчанию являются синглетонами и не должны содержать состояния.

Одностраничные приложения (как вы создаете с помощью Angular) должны в любом случае удерживать состояние на стороне клиента и передавать информацию при каждом запросе.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...