走進JavaWeb技術世界10:從JavaBean講到Spring

本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內容請到個人倉庫裏查看php

https://github.com/h2pl/Java-Tutorialhtml

喜歡的話麻煩點下Star哈前端

文章首發於個人我的博客:java

www.how2playlife.compython

本文是微信公衆號【Java技術江湖】的《走進JavaWeb技術世界》其中一篇,本文部份內容來源於網絡,爲了把本文主題講得清晰透徹,也整合了不少我認爲不錯的技術博客內容,引用其中了一些比較好的博客文章,若有侵權,請聯繫做者。git

該系列博文會告訴你如何從入門到進階,從servlet到框架,從ssm再到SpringBoot,一步步地學習JavaWeb基礎知識,並上手進行實戰,接着瞭解JavaWeb項目中常常要使用的技術和組件,包括日誌組件、Maven、Junit,等等內容,以便讓你更完整地瞭解整個JavaWeb技術體系,造成本身的知識框架。程序員

若是對本系列文章有什麼建議,或者是有什麼疑問的話,也能夠關注公衆號【Java技術江湖】聯繫做者,歡迎你參與本系列博文的創做和修訂。github

文末贈送8000G的Java架構師學習資料,須要的朋友能夠到文末了解領取方式,資料包括Java基礎、進階、項目和架構師等免費學習資料,更有數據庫、分佈式、微服務等熱門技術學習視頻,內容豐富,兼顧原理和實踐,另外也將贈送做者原創的Java學習指南、Java程序員面試指南等乾貨資源) web

Java Bean

Java語言欠缺屬性、事件、多重繼承功能。因此,若是要在Java程序中實現一些面向對象編程的常見需求,只能手寫大量膠水代碼。Java Bean正是編寫這套膠水代碼的慣用模式或約定。這些約定包括getXxx、setXxx、isXxx、addXxxListener、XxxEvent等。遵照上述約定的類能夠用於若干工具或庫。面試

舉個例子,假若有人要用Java實現一個單向鏈表類,可能會這樣寫:

上述實現爲了可以快速獲取鏈表的大小,把鏈表大小緩存在size變量中。用法以下:

JavaIntList myList = new JavaIntList( );

System.out.println(myList.size);

要節省內存,不要緩存size變量了,把代碼改爲這樣:

發現找不到什麼size變量。若是要找到size變量,你就必須保持向後兼容性。因此Java標準庫中,絕對不會出現public int size這樣的代碼,而必定會一開始就寫成:

private int size;

public int getSize( ){return size;}

讓用戶一開始就使用getSize,以便有朝一日修改getSize實現時,不破壞向後兼容性。這種public int getSize() { return size; }的慣用手法,就是Java Bean。

JSP + Java Bean

在jsp上,  能夠用java bean 來封裝業務邏輯,保存數據到數據庫, 像這樣:

其中jsp 直接用來接受用戶的請求, 而後經過java bean 來處理業務, 具體的使用方法是:

這就能把HTTP request中的全部參數都設置到 user 這個java bean 對應的屬性上去。 

只要保證 http request中的參數名和 java bean 中的屬性名是同樣的。 

這個叫作JSP Model 1 的模型受到了不少Java程序員的歡迎 ,  由於他們的應用規模都很小, 用Model 1 使得開發很快速,實際上, 這種方式和微軟的asp , 以及和開源的php 幾乎同樣。 

但在項目中頻繁使用了Model 1 致使整個系統的崩潰,由於系統中有好幾千個jsp, 這些jsp互相調用(經過GET/POST), 到了最後調用關係無人能搞懂。 

爲了解決這個問題,又推出了 :JSP Model 2 ,    這是個模型真正的體現了Model-View-Controller的思想:

Servlet 充當Controller ,  jsp 充當 View ,Java bean 固然就是Model 了!

業務邏輯, 頁面顯示, 和處理過程作了很好的分離。 

基於這個模型的擴展和改進,  不少Web開發框架開始如雨後春筍同樣出現, 其中最著名的就是 SpringMVC了。

Enterprise Java bean

愈來愈多企業程序員提出訴求:要分佈式、要安全、要事務、要高可用性。

訴求能夠歸結爲:「咱們只想關注咱們的業務邏輯, 咱們不想, 也不該該由咱們來處理‘低級’的事務, 多線程,鏈接池,以及其餘各類各類的‘低級’API, 此外Java帝國必定得提供集羣功能, 這樣咱們的一臺機器死機之後,整個系統還能運轉。 」

因而推出了J2EE, 像Java bean 同樣, 這仍是一個規範, 可是比Java bean 複雜的多, 其中有:

JDBC:  Java 數據庫鏈接

JNDI :  Java 命名和目錄接口, 經過一個名稱就能夠定位到一個數據源, 連jdbc鏈接都不用了

RMI:  遠程過程調用,  讓一個機器上的java 對象能夠調用另一個機器上的java 對象 

JMS :   Java 消息服務,  可使用消息隊列了

JTA:  Java 事務管理, 支持分佈式事務, 能在訪問、更新多個數據庫的時候,仍然保證事務, 仍是分佈式。

Java mail : 收發郵件

J2EE 後來改爲了Java EE。

固然最重要的是, java bean 變成了 Enterprise Java bean , 簡稱 EJB

使用了EJB, 你就能夠把精力只放在業務上了, 那些煩人的事務管理, 安全管理,線程 通通交給容器(應用服務器)來處理吧。 

咱們還提供了額外的福利, 只要你的應用服務器是由多個機器組成的集羣, EJB就能夠無縫的運行在這個集羣上, 你徹底不用考慮一個機器死掉了應用該怎麼辦。咱們都幫你搞定了。 

使用Session Bean , 能夠輕鬆的處理你的業務。

使用實體Bean (Entity bean ) , 你和數據庫打交道會變得極爲輕鬆, 甚至sql 都不用寫了。

使用消息驅動Bean(Message Driven bean ) , 你能夠輕鬆的和一個消息隊列鏈接, 處理消息。

Spring

然而,大部分的程序員就發現,  EJB中用起來極爲繁瑣和笨重, 性能也很差, 爲了得到所謂的分佈式,反而背上了沉重的枷鎖。 

實體Bean很快沒人用了, 就連簡單的無狀態Session bean 也被你們所詬病, 其中一條罪狀就是「代碼的侵入性」。

在定義EJB的時候沒考慮那麼多,程序員在定義一個Session bean的時候,須要寫一大堆和業務徹底沒有關係的類。 

還須要被迫實現一些根本不該該實現的接口及其方法: 

他們但願這個樣子:

public class HelloworldBean{

    public String hello(){

        return "hello world"

   }

}

與此同時,他們還過度的要求保留事務、 安全這些必備的東西。 

Spring 框架順應了POJO的潮流, 提供了一個spring 的容器來管理這些POJO, 也叫bean 。

對於一個Bean 來講,若是你依賴別的Bean , 只須要聲明便可, spring 容器負責把依賴的bean 給「注入進去「, 起初你們稱之爲控制反轉(IoC)。

後來 Martin flower 給這種方式起來個更好的名字,叫「依賴注入」(DI)。

若是一個Bean 須要一些像事務,日誌,安全這樣的通用的服務, 也是隻須要聲明便可, spring 容器在運行時可以動態的「織入」這些服務, 這叫面向切面(AOP)。 

總之,spring和spring mvc極大的增長了Java對web開發領地的統治力。

JavaBean 和 Spring中Bean的區別

先了解一下各自是什麼吧!

Jave bean

javaBean簡單的講就是實體類,用來封裝對象,這個類裏面所有都是屬性值,和get,set方法。簡單籠統的說就是一個類,一個可複用的類。javaBean在MVC設計模型中是model,又稱模型層,在通常的程序中,咱們稱它爲數據層,就是用來設置數據的屬性和一些行爲,而後我會提供獲取屬性和設置屬性的get/set方法JavaBean是一種JAVA語言寫成的可重用組件。爲寫成JavaBean,類必須是具體的和公共的,而且具備無參數的構造器。

spring bean

對於使用Spring框架的開發人員來講,咱們主要作的主要有兩件事情:①開發Bean;②配置Bean;而Spring幫咱們作的就是根據配置文件來建立Bean實例,並調用Bean實例的方法來完成「依賴注入」,能夠把Spring容器理解成一個大型工廠,Bean就是該工廠的產品,工廠(Spirng容器)裏能生產出來什麼樣的產品(Bean),徹底取決於咱們在配置文件中的配置。其實就是根據配置文件產生對象,而不須要人爲的手動去創造對象,下降了耦合.

用處不一樣:傳統javabean更多地做爲值傳遞參數,而spring中的bean用處幾乎無處不在,任何組件均可以被稱爲bean。

寫法不一樣:傳統javabean做爲值對象,要求每一個屬性都提供getter和setter方法;但spring中的bean只需爲接受設值注入的屬性提供setter方法。

javabean的寫法:

public class A{
    private String a;
    private void setA(String a){
    this.a = a;
    }
    private String getA(){
    return a;
    }
    }
    spring bean的寫法複製代碼
<bean id="p1" class="com.zking.Pojo.Person" scope="prototype">
    //及時加載 加載你的xml配置文件
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");
    //getbean輸入你配置類的別名獲得 person對象
     Person p = (Person) applicationContext.getBean("p1");複製代碼

id是給這個對象定的別名 class是這個實體類的全路徑名 根據配置文件來建立Bean實例,並調用Bean實例的方法 bean裏面還有不少屬性

生命週期不一樣:傳統javabean做爲值對象傳遞,不接受任何容器管理其生命週期;spring中的bean有spring管理其生命週期行爲。

全部能夠被spring容器實例化並管理的java類均可以稱爲bean。

原來服務器處理頁面返回的值都是直接使用request對象,後來增長了javabean來管理對象,全部頁面值只要是和javabean對應,就能夠用類.GET屬性方法來獲取值。javabean不僅能夠傳參數,也能夠處理數據,至關與把一個服務器執行的類放到了頁面上,使對象管理相對不那麼亂(對比asp的時候全部內容都在頁面上完成)。

spring中的bean,是經過配置文件、javaconfig等的設置,有spring自動實例化,用完後自動銷燬的對象。讓咱們只須要在用的時候使用對象就能夠,不用考慮若是建立類對象(這就是spring的注入)。通常是用在服務器端代碼的執行上。

參考文章

微信公衆號【碼農翻身】https://blog.csdn.net/hmh13548571896/article/details/100628104https://www.cnblogs.com/xll1025/p/11366413.htmlhttps://blog.csdn.net/qqqnzhky/article/details/82747333https://www.cnblogs.com/mike-mei/p/9712836.htmlhttps://blog.csdn.net/qq_42245219/article/details/82748460

微信公衆號

我的公衆號:程序員黃小斜

​黃小斜是 985 碩士,阿里巴巴Java工程師,在自學編程、技術求職、Java學習等方面有豐富經驗和獨到看法,但願幫助到更多想要從事互聯網行業的程序員們。​做者專一於 JAVA 後端技術棧,熱衷於分享程序員乾貨、學習經驗、求職心得,以及自學編程和Java技術棧的相關乾貨。​黃小斜是一個斜槓青年,堅持學習和寫做,相信終身學習的力量,但願和更多的程序員交朋友,一塊兒進步和成長!

原創電子書:關注微信公衆號【程序員黃小斜】後回覆【原創電子書】便可領取我原創的電子書《菜鳥程序員修煉手冊:從技術小白到阿里巴巴Java工程師》這份電子書總結了我2年的Java學習之路,包括學習方法、技術總結、求職經驗和麪試技巧等內容,已經幫助不少的程序員拿到了心儀的offer!

程序員3T技術學習資源: 一些程序員學習技術的資源大禮包,關注公衆號後,後臺回覆關鍵字 「資料」 便可免費無套路獲取,包括Java、python、C++、大數據、機器學習、前端、移動端等方向的技術資料。

技術公衆號:Java技術江湖

若是你們想要實時關注我更新的文章以及分享的乾貨的話,能夠關注個人微信公衆號【Java技術江湖】

這是一位阿里 Java 工程師的技術小站。做者黃小斜,專一 Java 相關技術:SSM、SpringBoot、MySQL、分佈式、中間件、集羣、Linux、網絡、多線程,偶爾講點Docker、ELK,同時也分享技術乾貨和學習經驗,致力於Java全棧開發!

Java工程師必備學習資源:關注公衆號後回覆」Java「便可領取 Java基礎、進階、項目和架構師等免費學習資料,更有數據庫、分佈式、微服務等熱門技術學習視頻,內容豐富,兼顧原理和實踐,另外也將贈送做者原創的Java學習指南、Java程序員面試指南等乾貨資源

個人公衆號


微信公衆號

我的公衆號:程序員黃小斜

​黃小斜是 985 碩士,阿里巴巴Java工程師,在自學編程、技術求職、Java學習等方面有豐富經驗和獨到看法,但願幫助到更多想要從事互聯網行業的程序員們。​做者專一於 JAVA 後端技術棧,熱衷於分享程序員乾貨、學習經驗、求職心得,以及自學編程和Java技術棧的相關乾貨。​黃小斜是一個斜槓青年,堅持學習和寫做,相信終身學習的力量,但願和更多的程序員交朋友,一塊兒進步和成長!

原創電子書:關注微信公衆號【程序員黃小斜】後回覆【原創電子書】便可領取我原創的電子書《菜鳥程序員修煉手冊:從技術小白到阿里巴巴Java工程師》這份電子書總結了我2年的Java學習之路,包括學習方法、技術總結、求職經驗和麪試技巧等內容,已經幫助不少的程序員拿到了心儀的offer!

程序員3T技術學習資源: 一些程序員學習技術的資源大禮包,關注公衆號後,後臺回覆關鍵字 「資料」 便可免費無套路獲取,包括Java、python、C++、大數據、機器學習、前端、移動端等方向的技術資料。

技術公衆號:Java技術江湖

若是你們想要實時關注我更新的文章以及分享的乾貨的話,能夠關注個人微信公衆號【Java技術江湖】

這是一位阿里 Java 工程師的技術小站。做者黃小斜,專一 Java 相關技術:SSM、SpringBoot、MySQL、分佈式、中間件、集羣、Linux、網絡、多線程,偶爾講點Docker、ELK,同時也分享技術乾貨和學習經驗,致力於Java全棧開發!

Java工程師必備學習資源:關注公衆號後回覆」Java「便可領取 Java基礎、進階、項目和架構師等免費學習資料,更有數據庫、分佈式、微服務等熱門技術學習視頻,內容豐富,兼顧原理和實踐,另外也將贈送做者原創的Java學習指南、Java程序員面試指南等乾貨資源

個人公衆號

相關文章
相關標籤/搜索