2015-06-10 12 views
0

快速高層次的概念..從命令行靜態的Util類與Spring,不確定我是否應該讓一個SpringBean,設計關注我的設計的

CLI tool to create AWS EBS snapshots 
CLI tool just calls Java class com.util.SnapshotUtil 
com.util.Snapshot calls AWS Interfacing class com.aws.AWSAdapter 

例如使用..

cli-tool create-snapshot.. calls java class eventually calling below method 
SnapshotUtil.createSnapshot() // statically call AWSAdapter.createSnapshot(); 

目前一切都是靜態的,並且在Spring之外。

現在我想知道AWSAdapter是否應該不是靜態的,並且由Spring加載,這意味着我的SnapshotUtil需要通過ApplicationContext創建適配器,我相信以及爲它提供一個帶有Adapter bean信息的XML。

最初我以爲這是一個簡單的util來處理ebs快照,我可以忽略Spring,但AWSAdapter可能被其他方式使用,但是,不確定靜態是專業還是con。

適配器被設計成僅與EBS快照處理,所以其基本上或者創建/刪除/通過使用AmazonEC2Client實例查看快照。即使一個Spring託管類想要使用這個Adapter,我的問題是如果它通過Spring加載適配器或者只是靜態地調用它,它是否很重要。響應

編輯回答:

我開始把它變成一個bean,並刪除了所有靜態引用,我給它一個getInstance方法(),這將負載本身通過ApplicationContext,並且,初始化等之後返回主調依賴和配置。當我從春天之外打電話給你時,那是好嗎?它似乎在工作,它仍然被認爲是「注入」?我非常肯定它沒有注入,因爲調用者不是春天管理的,但我覺得這可能是hacky?因爲我在非spring類中使用spring bean,所以我從來沒有用spring來管理,所以我覺得沒有理由把這個工具變成bean。我仍然會這樣做,因爲我明白其中的好處。

我有'把它變成一個bean的原因之一是它使用另一個我需要處理身份驗證的spring bean,但是我想到了它,我可以很容易地使用'new'關鍵字實例化另一個bean 。

我是正確的,當我說我把我的類轉換成豆,但它不是「注入」到主叫方,使用getInstance()方法時,至少?如果我在spring bean中使用getInstance方法(),如果我要通過彈簧配置「注入」實用工具,會有什麼區別嗎?

回答

2

一般來說,你應該偏好非靜態的。關於你的具體例子,你應該使用Spring bean,因爲當你開始用更復雜的功能擴展你的應用程序/模塊時,這會給你更多的靈活性。

例如,很快靜只有類將需要一些資源從系統的其他部分(我們都知道DI如何幫助這裏)。

或者你需要提醒的靜態調用某些方面(無論是隻有簡單的人,因爲每個請求的記錄,但認爲的更復雜的情況下,像交易)。對於Spring bean來說,實現起來非常簡單,而且非常重要的是,不需要大的重新設計和重新測試就可以簡單地添加。另外,將bean與其他Spring API以及已經與Spring很好集成的框架集成起來會更容易。例如,您將輕鬆在Apache Camel路由中使用您的bean。

這些只是我想到的幾點,還有更多。但是,一如既往,考慮所有的優點和缺點,爲工作選擇合適的工具。

問題

的編輯部分「當我把這個從春天之外,就是好嗎?」

是的,從Spring應用程序上下文中直接獲取bean實例並不是由Spring管理的,或者直到運行時才知道bean名稱。在我使用Apache Camel路由的例子中,這正是駱駝所做的。 :)

「我是否正確,當我說我把我的類變成一個bean,但它不是'注入'給調用者,至少在使用getInstance()方法?

是的,它仍然是一個擁有所有bean功能的bean(注入其他bean以及圍繞它的方面等)。

「如果我在spring bean中使用getInstance方法(),如果我要通過彈簧配置」注入「實用工具,會有什麼區別嗎?」

關於此問題,您可以查看question和由Martin Fowler編寫的article,該文檔也引用了該問題。

在我看來,你不應該這樣做,它的可讀性較差,而且沒有必要。將資源注入字段是一種類型安全的乾淨機制,用於聲明其依賴資源的類。

另外,如果頻繁執行,bean查找的代價可能很高。我在過去的一個項目中遇到過這個問題。我不知道爲什麼,但是Spring(至少我們使用Spring的版本)需要一些時間來查找並返回這個bean,並且如果在循環中執行它是很明顯的。

+0

請參閱編輯,這裏不能評論 – gallly

+0

@CatznDogz請看我編輯的答案。 –