天天看點

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

本系列文章将整理到我在GitHub上的《Java面試指南》倉庫,更多精彩内容請到我的倉庫裡檢視

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

喜歡的話麻煩點下Star哈

文章首發于我的個人部落格:

www.how2playlife.com

本文是微信公衆号【Java技術江湖】的《走進JavaWeb技術世界》其中一篇,本文部分内容來源于網絡,為了把本文主題講得清晰透徹,也整合了很多我認為不錯的技術部落格内容,引用其中了一些比較好的部落格文章,如有侵權,請聯系作者。

該系列博文會告訴你如何從入門到進階,從servlet到架構,從ssm再到SpringBoot,一步步地學習JavaWeb基礎知識,并上手進行實戰,接着了解JavaWeb項目中經常要使用的技術群組件,包括日志元件、Maven、Junit,等等内容,以便讓你更完整地了解整個JavaWeb技術體系,形成自己的知識架構。

如果對本系列文章有什麼建議,或者是有什麼疑問的話,也可以關注公衆号【Java技術江湖】聯系作者,歡迎你參與本系列博文的創作和修訂。

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/100628104 https://www.cnblogs.com/xll1025/p/11366413.html https://blog.csdn.net/qqqnzhky/article/details/82747333 https://www.cnblogs.com/mike-mei/p/9712836.html https://blog.csdn.net/qq_42245219/article/details/82748460

微信公衆号

個人公衆号:程式員黃小斜

微信公衆号【程式員黃小斜】新生代青年聚集地,程式員成長充電站。作者黃小斜,職業是阿裡程式員,身份是斜杠青年,希望和更多的程式員交朋友,一起進步和成長!專注于分享技術、面試、職場等成長幹貨,這一次,我們一起出發。

關注公衆号後回複“2020”領取我這兩年整理的學習資料,涵蓋自學程式設計、求職面試、算法刷題、Java技術學習、計算機基礎和考研等8000G資料合集。

技術公衆号:Java技術江湖

微信公衆号【Java技術江湖】一位阿裡 Java 工程師的技術小站,專注于 Java 相關技術:SSM、SpringBoot、MySQL、分布式、中間件、叢集、Linux、網絡、多線程,偶爾講點Docker、ELK,同時也分享技術幹貨和學習經驗,緻力于Java全棧開發!

關注公衆号後回複“PDF”即可領取200+頁的《Java工程師面試指南》強烈推薦,幾乎涵蓋所有Java工程師必知必會的知識點。