Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

State Pattern using Spring DI

Tags:

java

spring

I am facing a problem in converting my state pattern using plain java to spring DI since I am new to spring.

Actually I made a project using state pattern but I took the approach that every state knows it successive states not the context class.

The context class has a field "currentState" its type is IState, and it has method setState(IState state).

The IState has one method geNext(Context context).

And in the context class I made a while(keepOn) keepOn is true and it become false in ExitState to stop processing, in this loop I call currentState.goNext().

Each state make some database transactions and webservice's calls and depending on the result it set the next state using context.setState(new StateFour()) -for example-.

The first state is set by the client after creating the context.

Code sample:

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);}
}

Now I am trying to use spring DI annotation-based, the problem I am facing is that the context will annotated "currentState field" with @Autowired but I need the spring container to do the same logic if I am in state one and "if statement" success inject state three "else if" inject state two otherwise inject exitState.

If I use @Qualifier(value ="stateOne") it will specify only the first state which implements the interface but the other states which I set depending on the situation I don't know how to specify it in spring.

Also org.springframework.core.Ordered need specifying the orders of the beans in advance but I don't know the values I will receive from the database or webservice in advance, it should be specified at runtime.

So is it possible to replace this plain java with spring DI and how?

Thanks in advance for any help and sorry for lengthening.

like image 656
Ahmad Avatar asked Jun 20 '13 15:06

Ahmad


People also ask

What design pattern does Spring use?

The Spring application context uses the Factory method design pattern to create Spring beans in the container in the correct order according to the given configuration. So the Spring container has the responsibility of managing the life cycle of the bean from creation to destruction.

What is State pattern in Java?

State is a behavioral design pattern that allows an object to change the behavior when its internal state changes. The pattern extracts state-related behaviors into separate state classes and forces the original object to delegate the work to an instance of these classes, instead of acting on its own.

What is State pattern used for?

The state pattern is used in computer programming to encapsulate varying behavior for the same object, based on its internal state. This can be a cleaner way for an object to change its behavior at runtime without resorting to conditional statements and thus improve maintainability.


1 Answers

You should use ApplicationContext. Example below:

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

// Get bean from the context (equivalent to @Autowired)
applicationContext.getBean(StateThree.class);
like image 177
tfranckiewicz Avatar answered Oct 16 '22 01:10

tfranckiewicz