現代Java開發快

編程語言 Java IDE Erlang 最前沿編程諮詢 最前沿編程諮詢 2017-08-31

轉:http://www.tuicool.com/search?t=1&kw=Java&lang=2

Java開發快速而有趣。信不信由你。

我聽說很多Java在播客中受到抨擊,主要是開發人員從未做過專業的Java開發,並將Java視為愚蠢的Java瀏覽器插件或醜陋的跨平臺桌面應用程序。

但這不是我在說的。我的意思是,現在可以在很短的時間內在Java中編寫高質量的生產就緒代碼。所以這裡是關於我每天使用的工具和框架的概述。

下一節將介紹一下我的背景和過去Java與Java有關的問題。但是請隨意跳過,跳到“新的希望”。

XML地獄

幾年前,我幾乎完成了Java。我用Java ME(使用Java 1.3,根本不是很有趣)進行了多年的開發,以及Java SE與Spring 2的後端開發。另外,還有一些遺留系統,我必須保持前端運行的struts。

<?xml version = “1.0” encoding = “UTF-8” ?>< 豆 的xmlns = “http://www.springframework.org/schema/beans”

真美,不是嗎?

我基本上對Spring 2和Struts感到噁心,它的XML堆棧重構了一個地獄,很難閱讀。

所以我用普通的Java SE開始了下一個後端項目。我完全以測試為導向。我很快,使用IntelliJ生成所有樣板代碼。我真的把DI“的東西'非常嚴重的過度設計了。即使只有一個實現,我也有幾乎所有課程的接口。我沒有使用任何嘲諷的框架,因為我也有一些不好的經驗 - 使用EasyMock甚至PowerMock(不要使用它),並通過在測試中實現接口來編寫所有的嘲諷,如果我需要它。我也有巨大的主boostrap類,實際創建了生產實例,並進行了實際注入。那是一個500loc的怪物。

MyConfiguration config = loadConfiguration(); FirstClass firstClass = new FirstClass(config); SecondClass secondClass = new SecondClass(config,“someParam”); ThirdClass thirdClass = new ThirdClass(firstClass,secondClass);(......)

由於非常好的測試覆蓋率,該應用程序從投入生產後的第一個時刻開始工作。我唯一沒有覆蓋的地方,因此有錯誤是SQL查詢,你猜這個,我使用純JDBC編寫。

全部手動 所有這一切都是因為我過去使用任何類型的框架都有這樣糟糕的經歷。

我學到了很多東西,但我不想這樣做。所以我正在尋找一些利基工作,像Erlang後端開發人員(我還是喜歡那種語言)。我實際上拒絕了一個很好的Java開發人員,因為他們在採訪中告訴我們他們正在做Spring。最後,我被一個大型公司僱用了Java。

新希望

我是一個新團隊的一部分,可以選擇我們想要使用的技術。我們嘗試使用普通的Java,Camel,Java EE,vert.x,然後還有Spring 4和Spring Boot以及其他一些打開了我的眼睛的設施。

春天 - 魔法正在發生

彈簧芯

有了 Spring的 核心,我顯然可以用它的@Autowire 魔法替代這樣一個醜陋的bootstrap類 ,最重要的是沒有任何必要的XML:

@Service public class FooService { 私人 最終 FooRepository存儲庫 @Autowired

這是Spring的依賴注入的核心。這實際上是管家,讓你把所有你需要的東西放在銀盤上。你只需要打電話。Spoiler:龍捲風越來越好,見下文。

我實際上刪除了我的“每個類的接口”模式,除了我需要多個實現的地方。

Spring Web MVC - Gimme一些REST

我不需要任何Webserver設置或配置,我可以輕鬆地編寫一個 @Controller 返回一個Java類實例,它被序列化為JSON,沒有必要的代碼。

@Controller @RequestMapping(“/約會”)public class AppointmentsController { 私人 最終預約預約書 @Autowired

上面的代碼發佈了一個新的休息端點 /appointments 以及兩個 GET 端點,以檢索一天的所有約會和所有約會以及POST 創建新約會的 端點。該類 Appointment 可能實際上是一個持久化的實體,可以自動序列化為JSON。您將獲得正確解碼的路徑變量,並將其饋入類型方法參數。不需要額外的代碼。

參見 這裡 供參考。

彈簧數據

對於非常簡單的CRUD接口,我可以使用 Spring數據庫 甚至是 Spring Data REST 直接為我的實體創建一個REST接口。

公共 接口 OrderRepository 擴展了 CrudRepository < Order,Long > {}

對於此存儲庫,Spring Data REST會在其中公開一個集合資源 /orders 。該路徑是從被管理的域類的未資本化,多元化,簡單的類名派生的。它還為URI模板下的存儲庫管理的每個項目公開了一個項目資源 /orders/{id} 。*

*參見 這裡 供參考。

再次,很多魔法,但很酷很酷。在掃描Spring管理類的類路徑時,它會找到該接口並即時為存儲庫創建一個實現,您實際用於從數據庫(以及所有CRUD操作)中提取實體,以及它將創建一個REST控制器將向該存儲庫提供請求。

彈簧集成測試

使用 Mockito 來模擬測試中的對象就像一個魅力, AssertJ 用於測試斷言,甚至使用@SpringBootTest Real HTTP模擬服務器進行的全套集成測試 ,以及在沒有任何外部資源的情況下運行完整的應用程序測試的內存數據庫。

@RunWith(SpringRunner.class)@SpringBootTest public class MyTests { @MockBean

正如你所看到的,這段代碼中有很多討論。首先,啟動一個被稱為實際的Web服務器MockRestServiceServer ,一旦/greet/details 被請求就響應 。那麼RemoteService 你的應用程序的服務 被嘲笑,這被假定被被測試的類調用 MyService 。當該方法 someCall 被調用時,它將返回“world”。最後,使用AssertJ 進行驗證 。

春天安全

唯一的缺點是使用 Spring Security 進行身份驗證和自動化。它配備了各種可以使用的實現以及編寫自己的選項 AuthenticationProvider 。不幸的是,IMHO設計不好(從可用性的角度),更糟糕的是記錄在案。一旦你開始自定義它有點,它從來沒有像你所期望的那樣工作,你最終會花費幾個小時的時間來修復它。簡單來說,春天的安全大部分時間都是吸引人的。我希望很快就進行一些檢修。

彈簧靴

Spring Boot可以輕鬆創建可以“運行”的獨立的,生產級的基於Spring的應用程序。我們對Spring平臺和第三方圖書館有一個看法,所以你可以從最開始的時候開始。大多數Spring Boot應用程序需要很少的Spring配置。

  • 參見 這裡 供參考。

彈簧啟動把所有的一切放在一起,應用一個明智的默認配置和你的好去。

如果你想要一個非常有趣和非常好的實時編碼示例,我強烈推薦Josh Long的視頻 “Bootiful”應用程序與Spring Boot - 哇,這麼好!

JPA / Hibernate

當我幾年前曾經使用Hibernate的時候,還有我之前描述的XML配置。但是,最近的JPA,你只是做

@實體公共課客戶{ @Id

參見 這裡 供參考。

並與Spring數據存儲庫一起,您可以輕鬆訪問您的實體。這就是說,你只是簡單地描述你正在使用的數據,你不需要處理如何獲得它們。

最好的是,你不需要寫任何SQL。Hibernate非常適合創建優化的查詢。它將從數據庫中拉取數據並將其映射到 @Entitiy 類上。如果您對錶或列有一些醜陋的名稱,您可以簡單地註釋字段。上面的類希望有一 CUSTOMER 列具有, ÌDFISRTNAME and LASTNAME的列 。如果您需要訪問舊版數據庫,您可以自定義所需的內容,例如。

龍目島 - 沒有更多的吸氣

當Java 8出來時,我對這種古老的語言如何發展感到非常深刻的印象。然而,從我的觀點來看,有兩件事情是錯誤的:模式匹配和一種擺脫吸氣器和設置器的方法。

我們仍然沒有模式匹配(例如在Erlang中),但是 - 這真的是驚人的 - 我們可以通過使用庫來擺脫getter和setter。很多框架依賴於getter和setter,Hibernate,Jackson和Spring本身的存在。

當我第一次看到 龍目島時, 我認為這必須是一些代碼生成魔法,或者甚至更糟糕的是一些運行時反思技巧。此外,網站看起來像是從90年代開始。但是當我檢查出來,結果是我完全錯了。他們正在使用 javac 功能,編譯時註釋。因此,在編譯期間,執行Lombok的代碼並生成額外的字節代碼,不會生成額外的運行時開銷(與手動編寫getter和setter相比),而不需要中間Java代碼。

記住 FooService 從上面。使用 @AllArgsContructor ,Lombok為所有成員生成一個構造函數。

@Service @AllArgsConstructor @ Sl4j公共類FooService { 私人 最終 FooRepository 庫 ; 私人 最終 MyProperties 屬性 ; public getUri(String path){ log .debug(“從基本url {}和路徑{}構建uri”,properties.getSomeUrl(),path) 返回 屬性.getSomeUrl()+ path ;

使用 @Sl4j ,我們得到一個免費的記錄器(而不是做 Logger.getLogger(...) ),並有更好的東西,如生成 @ToString@EqualsAndHashcode

使用 Spring 4.3 ,您甚至可以完全刪除 @Autowire

@Configuration @ConfigurationProperties(prefix = “my.app”) @ Getter @Setter公共類MyProperties { 私人 字符串 someUrl ; 私有 整數 someTimeout ;

上述代碼可以用作彈簧屬性來配置應用程序。你可能會認為,這個剪輯比代碼有更多的註釋,這是真的。但是我還是寧願自己編寫所有的鍋爐代碼。

它允許您編寫一個YAML文件,如下所示,放置在jar旁邊以更改配置:

我的。app:

是的,它將自動允許您使用正確的命名,如 some-timeout 仍然知道如何映射到 someTimeout。您將獲得免費的應用程序的類型安全配置。你甚至可以加 @Validated 一起例如 @Max(1000)

Maven的

Maven是 在 庫管理工具。好的,Maven是很多的XML,好的,但它只是像一個魅力。我和Ant一起工作,得到同樣的結果是非常痛苦的。

我期待著在Android項目中使用Gradle,哦,我的天哪,這真的很糟糕。您需要編寫可執行任何操作的可執行腳本(並且做任何事情,特別是在不想要的情況下)。你永遠不知道它的一個方法,或者它的配置。我最終花了幾個小時的時間打印調試我的構建腳本,直到它做了我想要的。

只是因為XML,Maven的定義是明確的,你幾乎不能以沒有意圖的方式來打破東西。Maven是圖書館依賴關係,特別是當您將其與加載代碼的其他“包管理器”進行比較時,將其構建(XCode,Erlang)或像NPM和Bower這樣的垃圾郵件。Maven只是你構建過程的一個組成部分,沒有必要像在pip (Python)中一樣下載一個庫 ,所以你總是會得到正在構建的那個項目的那個lib的確切版本。

Java的

如上所述,Java 8具有一些功能特性,並且Lambdas非常方便,儘管它們不一定是功能性的。流首先看起來很棒,但大多數情況下,您最終會得到沒有人(甚至在一週之後)都可以閱讀的意大利麵條代碼。大多數情況下,你最好用一個很好的舊循環。

但是一般來說,儘可能多地編寫功能代碼(這可能是Java的第一個版本)。這意味著一個方法應該總是返回一個值(不是void),並且應該總是為相同的參數返回相同的值。這需要

  • 不使用系統調用(如 currentTimeMillis()

  • 不與文件,數據庫等進行交互

  • 使用類變量

顯然,如果你這麼做100%,你的應用程序是完全沒有價值的,因為你沒有辦法控制它,也沒有獲得任何輸出。所以我嘗試的是保持我的核心業務邏輯儘可能的清潔,並將副作用盡可能的遠。這有利於測試很多。

IDE

過去,我實際上通過了許多IDE轉移,從QBasic,Turbo Pascal,Visual Studio,Eclipse,NetBeans,XCode等開始 vim 。但我失去了對IntelliJ IDEA的心, 這只是我曾經使用過的最好的IDE。它開始於beeing美麗快速,支持非常好和直觀的鍵盤快捷鍵,您可以自動類型和自動過濾所有菜單,甚至上下文菜單。它允許使用強大的重構併為您生成代碼。我支持非常好的調試以及顯示代碼覆蓋率。

您現在可能對IDE感到滿意,但您至少應該嘗試一次IDEA,並觀看有關功能的視頻。

特別是當我使用XCode作為一個應用程序項目時,我覺得像在IntelliJ的石器時代。不幸的是,即使JetBrains AppCode仍然需要XCode的一些東西。

這是生態系統

所以,這不是關於這個語言。它不是關於IDE或構建工具。這一切都在一起,使Java開發變得快速而有趣。

1、具有1-5工作經驗的,面對目前流行的技術不知從何下手,

需要突破技術瓶頸的可以加。2、在公司待久了,過得很安逸,

但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,

常用設計思想,常用java開發框架掌握熟練的,可以加。

4、覺得自己很牛B,一般需求都能搞定。

但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。

5. 群號:高級架構群 606187239備註好信息!

6.阿里Java高級大牛直播講解知識點,分享知識,

多年工作經驗的梳理和總結,帶著大家全面、

科學地建立自己的技術體系和技術認知!

相關推薦

推薦中...