2014-05-06 46 views
1

我們有一個應該在運行時確定依賴關係的場景。一個例子說明如下細節:如何在春季實現動態依賴注入?

public class OrderProcessor { 
    // The Validator should be determinded based on the version of the service. 
    private Validator orderProcessValidator; 

    public Confirmation process(Order order) { 
     if(orderProcessValidator.validate(order)) { 
      // Business logic 
     } 
    } 
} 

可以使用Spring IOC動態注入Validator,或只能通過工廠模式來解決?

+1

確定使用哪個驗證程序的邏輯是什麼? (你說的是「服務的版本」,但是我在你的代碼中看不到'服務') –

+0

版本我的意思是api版本控制。在這個例子中,假設我們有2個版本的「Order」。版本2.0具有更多數量的字段,並且需要一個單獨的驗證程序,而不是版本爲1.0的字段較少的驗證程序。在我們的應用程序中,我們已經有了2個驗證器,但是我們需要知道一個機制,如何使用spring在正確的場景下注入正確的驗證器。對於我們來說,保留業務邏輯是相同的,所以它被同一個OrderProcessor處理。 – Bharimalla

回答

0

這對我來說還是有點不清楚,但我假設你在項目中有兩個實際的Order類。也許一個在com.foo.api1包中,另一個在com.foo.api2包中。或者一個訂單被稱爲Order1,另一個被稱爲Order2。這個想法是,我假設你有兩個不同的類爲Order的兩個'api版本'。

你可以實現你需要使用Spring AOP是什麼:

@Aspect 
@Component 
public class MyAspect { 
    @Autowired 
    private Validator1 validator1; 
    @Autowired 
    private Validator2 validator2; 

    @Pointcut("execution(* com.foo.bar.OrderProcessor.process(..))") 
    private void myPointcut() {} 

    @Around("myPointcut() && args(order)") 
    public Object myAroundAdvice(ProceedingJoinPoint pjp, Object order) throws Throwable { 
     if (order instanceof Order1) { 
      validator1.validate((Order1) order); 
     } else 
     if (order instanceof Order2) { 
      validator2.validate((Order2) order); 
     } 
     Object retVal = pjp.proceed(); 
     return retVal; 
    } 
} 

@Component 
public class OrderProcessor { 
    public void process(Object order) { 
     System.out.println("processing order"); 
    } 
} 

@Component 
public class Validator1 { 
    public void validate(Order1 order) { 
     System.out.println("validating inside validator 1"); 
    } 
} 

@Component 
public class Validator2 { 
    public void validate(Order2 order) { 
     System.out.println("validating inside validator 2"); 
    } 
} 

所以,基本上,你要定義應該攔截來電到您的訂單處理器類,並根據它收到什麼參數一個方面,它調用一個驗證者或另一個驗證者。