2013-06-20 5 views
4

У меня возникла проблема с преобразованием моего шаблона состояния с использованием простой java для пружины DI, так как я новичок в весне.State Pattern с использованием Spring DI

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

Класс контекста имеет поле «currentState», его тип IState, и он имеет метод setState (состояние IState).

У IState есть один метод geNext (контекст контекста).

И в контексте класса, который я сделал while (keepOn), keepOn истинно, и в ExitState он перестает обрабатывать, в этом цикле я вызываю currentState.goNext().

Каждое государство выполняет некоторые транзакции базы данных и вызовы webservice, и в зависимости от результата оно устанавливает следующее состояние с помощью context.setState (новый StateFour()) - например.

Первое состояние задается клиентом после создания контекста.

образец

Код:

public interface IState{public void goNext(Context context);} 

public class StateOne implements IState{ 
     public void goNext(Context context){ 
      //do some logic 
      if(user.getTitle.equals("manager"){context.setState(new StateThree());} 
      else if(user.getTitle.equals("teamLead"){context.setState(new StateTwo());} 
      else{context.setState(new ExitState());} 
     } 
} 

public class Context{ 
    private boolean keepOn = true; 
    private IState currentState; 
    public void setState(IState state){ 
     currentState = state; 
    } 
    while(keepOn){currentState.goNext(this);} 
} 

Теперь я пытаюсь использовать пружинный DI аннотацию на основе, проблема я столкнулся в том, что контекст аннотированный «CurrentState поле» с @Autowired, но мне нужно пружинный контейнер сделать ту же логику, если я нахожусь в состоянии один, и «если утверждение» успешно введет состояние три «else if», впрысните состояние два, иначе вставьте exitState.

Если я использую @Qualifier (value = "stateOne"), он будет указывать только первое состояние, которое реализует интерфейс, но другие состояния, которые я задал в зависимости от ситуации, я не знаю, как указать его весной.

Также org.springframework.core.Ordered нужно указать заказы компонентов заранее, но я не знаю значений, которые я получу из базы данных или веб-сервиса заранее, его следует указывать во время выполнения.

Так можно заменить эту обычную java пружиной DI и как?

Заранее благодарим за помощь и извините за удлинение.

ответ

1

Вы должны использовать ApplicationContext. Пример ниже:

// Inject application context into your bean 
@Autowired 
ApplicationContext applicationContext; 

// Get bean from the context (equivalent to @Autowired) 
applicationContext.getBean(StateThree.class); 
0

Самый универсальный способ автоматического провода состояние является путем регистрации разрешаемое зависимость с ConfigurableListableBeanFactory. В качестве зависимости вы можете отказаться от своей реализации org.springframework.beans.factory.ObjectFactory<T>, которая получит текущего пользователя и создает/выбирает состояние, которое нужно ввести.

Это именно то, что происходит, когда вы, например, автоматически связываете поле типа HttpServletRequest. A RequestObjectFactory получит текущий запрос и введет его с помощью этой реализации.

// org.springframework.web.context.support.WebApplicationContextUtils 

private static class RequestObjectFactory implements ObjectFactory<ServletRequest>, Serializable { 

    @Override 
    public ServletRequest getObject() { 
     return currentRequestAttributes().getRequest(); 
    } 

    @Override 
    public String toString() { 
     return "Current HttpServletRequest"; 
    } 
}