【问题标题】:State Pattern using Spring DI使用 Spring DI 的状态模式
【发布时间】:2013-06-20 15:46:59
【问题描述】:

由于我是 Spring 新手,因此在使用普通 Java 将状态模式转换为 Spring DI 时遇到问题。

实际上我使用状态模式制作了一个项目,但我采用的方法是每个状态都知道它是连续状态而不是上下文类。

上下文类有一个字段“currentState”,它的类型是 IState,它有方法 setState(IState state)。

IState 有一个方法 geNext(Context context)。

在上下文类中我设置了一个 while(keepOn) keepOn 为真,它在 ExitState 中变为假以停止处理,在这个循环中我调用 currentState.goNext()。

每个状态都会进行一些数据库事务和 Web 服务调用,并根据结果使用 context.setState(new 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);}
}

现在我正在尝试使用基于 Spring DI 注释的问题,我面临的问题是上下文将使用 @Autowired 注释“currentState 字段”,但如果我处于状态一,我需要 spring 容器执行相同的逻辑和“if语句”成功注入状态三“else if”注入状态二否则注入exitState。

如果我使用 @Qualifier(value ="stateOne") 它将仅指定实现接口的第一个状态,但我根据情况设置的其他状态我不知道如何在 spring 中指定它。

另外org.springframework.core.Ordered需要提前指定bean的顺序但是我不知道我会提前从数据库或者webservice接收到什么值,应该在运行时指定。

那么有没有可能用spring DI替换这个普通的java以及如何?

在此先感谢您的帮助,并抱歉延长。

【问题讨论】:

    标签: java spring


    【解决方案1】:

    您应该使用 ApplicationContext。示例如下:

    // Inject application context into your bean
    @Autowired
    ApplicationContext applicationContext;
    
    // Get bean from the context (equivalent to @Autowired)
    applicationContext.getBean(StateThree.class);
    

    【讨论】:

      【解决方案2】:

      自动连接状态的最通用方法是使用ConfigurableListableBeanFactory 注册可解析的依赖项。作为依赖项,您可以删除 org.springframework.beans.factory.ObjectFactory<T> 的实现,这将获取当前用户并创建/获取要注入的状态。

      例如,当您自动连接HttpServletRequest 类型的字段时,就会发生这种情况。 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";
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-27
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-15
        • 1970-01-01
        相关资源
        最近更新 更多