2013-02-22 49 views
0

您好,我是Annotation和Spring AOP的新手。下面是我想實現使用Spring AOP 3.1.0使用方法參數設置服務實例

public interface Service { 
    public void process(String ServiceName, Bean bean); 
} 

public class ServiceImpl1 implements Service{ 
    public void process(String ServiceName, Bean bean) { 

     /// do something here  
    } 
} 

public class ServiceImpl2 implements Service{ 
    public void process(String ServiceName, Bean bean) { 

     /// do something here 
    } 
} 
從其他類

我會用AroundAdvice和建議之前被調用類似

... 

public void doSomething(String serviceName, Bean bean){ 

    service.process("ServiceImpl1", bean); 

} 
... 

我可以達到同樣的和攔截我DoSomething的方法,然後實例讀取serviceName後的服務對象。

我有更好的方法呢?

我只是需要一個方向,然後我會解決這個問題。

感謝

回答

0

嗯,我猜你想要做的是有一個之前的建議是發生在服務名稱傳遞,創造適當的類的對象,然後調用新創建的對象上的適當方法。看起來,對我而言,您確實在尋找更多的工廠模式,但試圖使用AOP來實現它。

如果您使用Factory模式,您將創建一個名爲ServiceFactory的類,該類將接收一些參數併爲這些參數返回正確的Service實現。您調用代碼只需使用Factory在運行時獲得正確的服務。

另一種方法,如果你想堅持更多的DI模式,可能會創建一個包裝類,作爲「指揮」。這可能會有一個服務名稱映射到服務實現。然後你可以將這個包裝器注入到代碼中,甚至可以將Map注入包裝器中。您的調用代碼會調用封裝器上的方法,這會找到正確的單例實現並將調用集中到它。

我只是覺得使用AOP來解決這個問題是很麻煩的。

+0

是的,我試圖用AOP來實現這一點。我已經有了一個工廠模式。 – user1720707 2013-02-22 14:24:57

+0

我不知道,這似乎應該是一本反模式的書。在您的場景中,您可以創建ServiceImpl1的實例,但使用AOP最終會調用ServiceImpl2上的方法。更不用說,選擇是基於傳入該方法的一些任意字符串。各種各樣的警報都在我腦海中消失。這不僅似乎不太安全,但我無法想象試圖支持這一點。不管怎樣,真正購買你的是那些更爲完善的模式不能做到的? – CodeChimp 2013-02-22 14:55:03

+0

正如我已經提到,我正在尋找更好的方法,如果這不是一個,我已經有工廠實施。如果有更清晰的註解方法,那麼爲什麼不呢?如果這不安全,你能解釋爲什麼這不是嗎? – user1720707 2013-02-22 16:34:51

0

您可以使用spring @Autowire註釋來注入服務impl類。由於你有2個實現類,你可以使用限定符來指定哪個impl需要注入。

+0

謝謝,我會試試這個並恢復:) – user1720707 2013-02-22 16:35:22

相關問題