本文以及接下來的一些博客通過演示Spring Social的使用來了解整個社交場景,而我將以非常基礎的內容開始。
如果您看過Spring Social Samples,您會知道它們包含幾個非常好的和完整的“ quickstart”應用程序。 一個用于Spring 3.0.x,另一個用于Spring3.1.x。 在研究這些應用程序時,讓我印象深刻的是,您必須學習許多概念才能欣賞正在發生的事情。 這包括配置,外部授權,提要集成,憑證持久性等……大多數復雜性源于您的用戶需要登錄其軟件即服務(SaaS)帳戶(例如Twitter,Facebook或QZone)的事實,以便您的應用程序可以訪問其數據1 。 由于周圍有大量的SaaS提供程序以及它們使用的授權協議數量不同,這使情況更加復雜。
因此,我認為我將嘗試將所有這些分解為各個單獨的組件,以解釋如何構建有用的應用程序; 但是,我將從一些背景開始。
Spring的家伙們正確地意識到,互聯網上有如此眾多的SaaS提供商,他們永遠無法為所有這些提供商編寫模塊,因此他們將功能分為兩部分,第一部分包括spring-social-core和spring-social-web模塊,為每個SaaS提供程序提供基本的連接性和授權代碼。 提供所有這些聽起來像是一項艱巨的任務,但它的簡化之處在于,要成為SaaS提供者,您需要實現所謂的OAuth協議 。 我還沒有介紹OAuth的詳細信息,但簡而言之,OAuth協議執行了一個復雜的小操作,允許用戶與您的應用程序共享其SaaS數據(即他們在Facebook等上擁有的東西),而無需用戶分發他們的您的應用程序的憑據。 至少有三個版本:1.0、1.0a和2.0,并且SaaS提供程序可以自由實現他們喜歡的任何版本,通常會添加自己的專有功能。
此拆分的第二部分包括SaaS提供程序模塊,這些模塊知道如何與最低級別的各個服務提供程序服務器進行通信。 Spring的家伙目前提供 基本服務 ,西方世界是 Facebook , LinkedIn 和 Twitter 。 采用廣泛的模塊化方法的好處是,您還可以使用很多其他社區主導的模塊:
- Spring社交500px
- Spring社交BitBucket
- Spring社交挖掘
- Spring社交保管箱
- Spring社交展
- Spring社交電影
- Spring社交四方
- Spring社交Google
- Spring社交Instagram
- Spring社交Last.fm
- Spring Social Live(Windows Live)
- Spring社會味iso
- Spring社交Mixcloud
- Spring社交Nk
- Spring社會銷售人員
- Spring社交SoundCloud
- Spring社交活動
- Spring社交視頻
- Spring社交活動
- Spring社交微博
- Spring社會興
- Spring社交Yammer
- Spring社會保障模塊
- Spring Social Grails插件
但是,這只是可用服務數量的一部分:要查看此列表的大小,請訪問AddThis網站,并找出它們支持的服務。

返回代碼
現在,如果您像我一樣,那么在編程方面,您會討厭安全性:從開發角度來看,這非常麻煩,會阻止您編寫代碼并使您的生活變得困難,所以我想我應該開始通過扔掉所有東西并編寫一個顯示一些基本SaaS數據的小應用程序。 事實證明,這可能是因為某些SaaS提供商(例如Twitter)同時服務于私有數據和公共數據。 私有數據是您需要登錄的東西,而公共數據對任何人都可用。
在今天的場景中,我正在編寫一個基本應用程序,該應用程序使用Spring Social Twitter Module在應用程序中顯示Twitter用戶的時間線,而您要做的只是Twitter用戶的屏幕名稱。
要創建該應用程序,第一步是使用SpringSource Toolkit儀表板的模板部分創建一個基本的Spring MVC項目。 這提供了一個Web應用程序,可幫助您入門。
第二步是將以下依賴項添加到pom.xml文件中:
<!-- Twitter API --><dependency><groupId>org.springframework.social</groupId><artifactId>spring-social-twitter</artifactId><version>${org.springframework.social-twitter-version}</version></dependency><!-- CGLIB, only required and used for @Configuration usage: could be removed in future release of Spring --><dependency><groupId>cglib</groupId><artifactId>cglib-nodep</artifactId><version>2.2</version></dependency>
上面的第一個依賴關系是針對Spring Social的Twitter API的,而第二個依賴關系是使用Spring 3的@Configuration注釋配置應用程序所必需的。 請注意,您還需要通過添加以下內容來指定Twitter API版本號:
<org.springframework.social-twitter-version>1.0.2.RELEASE</org.springframework.social-twitter-version>
…到文件頂部的<properties>部分。
步驟3是您需要配置Spring的地方。 如果查看Spring Social示例代碼,您會注意到Spring的家伙使用Java和Spring 3 @Configuration注釋配置他們的應用程序。 這是因為基于Java的配置比基于XML的原始配置具有更大的靈活性。
@Configurationpublic class SimpleTwitterConfig {private static Twitter twitter;public SimpleTwitterConfig() {if (twitter == null) {twitter = new TwitterTemplate();}}/*** A proxy to a request-scoped object representing the simplest Twitter API* - one that doesn't need any authorization*/@Bean@Scope(value = 'request', proxyMode = ScopedProxyMode.INTERFACES)public Twitter twitter() {return twitter;}}
上面的代碼所做的全部是通過Spring的Twitter接口為Spring提供一個簡單的TwitterTemplate對象。 對于這個基本應用程序,使用@Configuration絕對是多余的,但是我將在以后的博客中繼續使用它。
有關@Configuration批注和基于Java的配置的更多信息,請查看:
- Spring的基于Java的依賴注入
- 更多基于Spring Java的DI
編寫完配置類后,接下來要做的就是整理控制器。 在這個簡單的示例中,我使用了一個簡單的@RequestMapping處理程序,該處理程序處理如下所示的URL:
<a href=timeline?id=roghughe>Grab Twitter User Time Line for @roghughe</a><br />
……代碼看起來像這樣:
@Controllerpublic class TwitterTimeLineController {private static final Logger logger = LoggerFactory.getLogger(TwitterTimeLineController.class);private final Twitter twitter;@Autowiredpublic TwitterTimeLineController(Twitter twitter) {this.twitter = twitter;}@RequestMapping(value = 'timeline', method = RequestMethod.GET)public String getUserTimeline(@RequestParam('id') String screenName, Model model) {logger.info('Loading Twitter timeline for :' + screenName);List<Tweet> results = queryForTweets(screenName);// Optional Step - format the Tweets into HTMLformatTweets(results);model.addAttribute('tweets', results);model.addAttribute('id', screenName);return 'timeline';}private List<Tweet> queryForTweets(String screenName) {TimelineOperations timelineOps = twitter.timelineOperations();List<Tweet> results = timelineOps.getUserTimeline(screenName);logger.info('Fond Twitter timeline for :' + screenName + ' adding ' + results.size() + ' tweets to model');return results;}private void formatTweets(List<Tweet> tweets) {ByteArrayOutputStream bos = new ByteArrayOutputStream();StateMachine<TweetState> stateMachine = createStateMachine(bos);for (Tweet tweet : tweets) {bos.reset();String text = tweet.getText();stateMachine.processStream(new ByteArrayInputStream(text.getBytes()));String out = bos.toString();tweet.setText(out);}}private StateMachine<TweetState> createStateMachine(ByteArrayOutputStream bos) {StateMachine<TweetState> machine = new StateMachine<TweetState>(TweetState.OFF);// Add some actions to the statemachinemachine.addAction(TweetState.OFF, new DefaultAction(bos));machine.addAction(TweetState.RUNNING, new DefaultAction(bos));machine.addAction(TweetState.READY, new ReadyAction(bos));machine.addAction(TweetState.HASHTAG, new CaptureTag(bos, new HashTagStrategy()));machine.addAction(TweetState.NAMETAG, new CaptureTag(bos, new UserNameStrategy()));machine.addAction(TweetState.HTTPCHECK, new CheckHttpAction(bos));machine.addAction(TweetState.URL, new CaptureTag(bos, new UrlStrategy()));return machine;}}
getUserTimeline方法包含三個步驟:首先,它包含一些推文,進行一些格式化,然后將結果放入模型中。 對于此博客,最重要的一點是掌握推文,您可以看到這是通過List <tweet> queryForTweets(String screenName)方法完成的。 此方法有兩個步驟:使用Twitter對象獲取TimelineOperations實例,然后使用該對象使用屏幕名稱作為參數來查詢時間線。
如果您查看Twitter界面,它將充當工廠對象,并返回其他對象來處理不同的Twitter功能:時間軸,直接消息傳遞,搜索等。我想這是因為開發人員意識到Twitter本身包含了如此多的功能,如果所有必需的方法都在一個類中,然后他們手上會有一個上帝對象 。
我還包括了將Tweets轉換為HTML的可選步驟。 為此,我使用了State Machine項目和博客中的JAR,您可以在formatTweets(...)方法中查看其工作方式。
將Tweet的列表作為屬性放入模型后,要完成的最后一件事情是編寫一個JSP來顯示數據:
<ul><c:forEach items='${tweets}' var='tweet'><li><img src='${tweet.profileImageUrl}' align='middle'/><c:out value='${tweet.createdAt}'/><br/><c:out value='${tweet.text}' escapeXml='false'/></li></c:forEach>
</ul>
如果您實現了可選的錨標記格式,那么這里要記住的關鍵是確保瀏覽器可以使用格式化的TweetHTML。 這可以通過使用c:out標記的escapeXml ='false'屬性或將$ {tweet.text}直接放入JSP中來實現。
在此示例中,我沒有包含任何樣式或花哨的前端,因此,如果您運行代碼2 ,則應獲得以下內容:

以上就是我對Spring Social的簡單介紹,但是仍然有很多基礎。 在我的下一個博客中,我將了解背景情況。
1我猜這里有很多隱私和數據保護合法性問題要考慮,尤其是如果您使用此API存儲用戶數據時,我希望對此發表評論和意見。
2該代碼可在GitHub上的git項目中的git://github.com/roghughe/captaindebug.git上找到。
參考:來自Captain Debug博客博客的JCG合作伙伴 Roger Hughes的Spring Social入門 。
翻譯自: https://www.javacodegeeks.com/2012/06/getting-started-with-spring-social.html