java常用代碼架構示例 java經典代碼

java架構有哪些

Java架構:

為華州等地區(qū)用戶提供了全套網頁設計制作服務,及華州網站建設行業(yè)解決方案。主營業(yè)務為網站設計、做網站、華州網站設計,以傳統(tǒng)方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

軟件架構作為一個概念,體現在技術和業(yè)務兩個方面。

從技術角度來說:軟件架構隨著技術的革新不斷地更新其內容,軟件架構建立于當前技術和一些基本原則的基礎之上。

先說一些基本原則:

分層原則:分層是為了降低軟件深度復雜性而使用的關鍵思想,就像社會有了階級一樣,軟件有了層次結構。

模塊化原則:模塊化是化解軟件廣度復雜的必然手段,模塊化的目的就是讓軟件分工。

接口實現分離原則隨著軟件模塊化的不斷深入改進,面向接口編程而不是面向實現編程可以讓復雜度日趨增高的軟件降低模塊之間的耦合度,從而讓各模塊更輕松改進。從這個原則出發(fā),軟件也從微觀進行了細致的規(guī)范化。

還有兩個比較小但很重要的原則:

細節(jié)隱藏原則很顯然把復雜問題簡化,把難看的細節(jié)隱去,能讓軟件結構更清晰。其實這個原則使用很普遍,java/c++語言中的封裝原則以及設計模式中的Facade(外觀)模式就很能體現這個原則的精神。

依賴倒置原則隨著軟件結構的進一步發(fā)展,層與層之間、模塊與模塊之間的依賴逐漸加深,而層、模塊的動態(tài)可插拔要求不端增大。依賴倒置原則可看視為接口實現分離原則的深化,根據此原則的精神,軟件進入了工具時代。這個原則有點類似于知名的好萊塢法則:Don't call us, we'll call you。

以上這些原則奠定了我們的軟件架構的價值指標。但軟件架構畢竟是建立在當前技術之上的。而每一代技術都有架構模式。過去的不再說了,讓我們現在就來看一下當前流行的技術,以及當前我們能采用的架構。

因為面向對象是當前最流行開發(fā)技術,且設計模式的大量使用使面向對象的走向成熟,而數據庫是當前最有效的存儲結構、web界面是當前最流行的用戶接口,所以當前最典型的三層次架構就架構在以上幾項技術的基礎之上,用數據庫作存儲層、用面向對象來實現業(yè)務層、用web來作為用戶接口層。我們從三層次架構談起:

因為面向對象技術和數據庫技術不適配,所以在標準三層次架構的基礎上,我們增加了數據持久層,來管理O-R雙向映射,但目前一直沒有最理想的實現技術。cmp和entity bean技術因為其實現復雜,功能前景有限,已接近被淘汰的邊緣。JDO及hibernate作為o-r映射的后期之秀,尤其是hibernate,功能相當完備。推薦作為持久層的首選

在業(yè)務層,因為當前業(yè)務日趨負載,且變動頻繁,所以我們必須有足夠敏捷的技術來保證我們的適應變化的能力,在標準j2ee系統(tǒng)中session bean負責業(yè)務處理,且有不錯的性能表現,但采用ejb系統(tǒng)對業(yè)務架構模式改變太大,且其復雜而昂貴,業(yè)務代碼移植性差。而spring 作為一個bean配置的輕量級架構,漂亮的IOC模式實現,對業(yè)務架構影響小,所以推薦作為中間層業(yè)務框架。

在用戶結構層,雖然servlet/jsp/jstl/javaBean 能夠實現MVC架構,但終究過于粗糙。struts對MVC架構的實現就比較完美,Taperstry也極好地實現MVC架構,且采用基于事件的方式,非常誘人,惜其不夠成熟,我們仍舊推薦struts作為用戶接口層基礎架構。

因為業(yè)務層是三層次架構中最有決定意義的,所以讓我們回到業(yè)務層細致地分析一下,在復雜的業(yè)務我們常常需要以下基礎服務的一種或幾種:事務一致性服務acid(tool:jta/jts)、并發(fā)加鎖服務concurrentlock、池化管理服務cache、訪問控制服務(tool:jaas)、流程控制服務workflow、動態(tài)實現服務IOC,串行化消息服務(tool:jms)、負載平衡服務blance等。如果我們不采用重量級應用服務器(如weblogic,websphere,jboss等)及重量級組件(EJB),我們必須自己實現其中一些服務。雖然我們大多情況下,不需要所有這些服務,但實現起來卻非易事。幸運的是我們有大量的開源實現代碼,但采用開源代碼卻常常是件不輕松的事。

隨著xml作為結構化信息傳輸和存儲地位日漸重要,一些xml文檔操作工具(DOM,Digester,SAX等)的使用愈發(fā)重要,而隨著xml schema的java binding工具(jaxb,xmlbean等)工具的成熟,采用xml schema來設計xml文檔格式,然后采用java binding來生成java bean 會成為主要編程模式,而這又進一步使數據中心向xml轉移,使在中小數據量上,愈發(fā)傾向于以xquery為查詢語言的xml數據庫。最近還有一個趨勢,microsoft,ibm等紛紛大量開發(fā)中間軟件如(microsoft office之infopath),可以直接從xml schema 生成 錄入頁面等非常實用的功能。還有web service 的廣泛應用,都將對軟件的架構有非常重大的影響。至于面向服務架構(SOA)前景如何,三層次架構什么時候走入歷史,現在還很難定論。

aop的發(fā)展也會對軟件架構有很深的影響,但在面向對象架構里,無論aspectJ還是jboss-aop抑是aspectWerks、nanning都有其自身的嚴重問題:維護性很差,所以說它將很難走遠。也許作為一個很好的思想,它將在web service里大展身手。

rdf,owl作為w3c語義模型的標志性的語言,也很難想象能在當前業(yè)務架構發(fā)揮太大影響。但如果真如它所聲稱那樣,廣泛地改變著信息的結構。那么對軟件架構也會有深遠影響。

有關架構設計的一些忠告:

盡量建立完整的持久對象層.可獲得高回報

盡量將各功能分層,分塊,每一模塊均依賴假定的其它模塊的外觀

不能依賴靜態(tài)數據來實現IOC模式,應該依賴數據特征接口,靜態(tài)數據僅是數據特征接口實現方式之一

架構設計時xml是支持而不是依賴.但可以提供單一的xml版本的實現

從業(yè)務角度說:軟件架構應是深刻體現業(yè)務內部規(guī)則的業(yè)務架構,但因為業(yè)務變化頻纴,所以軟件架構很難保持恒定不變,但業(yè)務的頻繁變化不應是軟件架構大規(guī)模頻繁變化的原因,軟件架構應是基于變化的架構。

一種業(yè)務有其在一段時間內穩(wěn)定存在的理由(暫且不談),業(yè)務內部有許多用例,每一種用例都有固定的規(guī)則,每一規(guī)則都有一些可供判定的項,每一項從某一維度來觀察都是可測量的,我們的架構首先必須保證完美適應每一項每一種測量方式,很多失敗的架構都是因為很多項的測量方式都發(fā)生變更這種微觀變化中。

每個用例都有規(guī)則,我們在作業(yè)務用例分析,常常假定一些規(guī)則是先驗的,持久穩(wěn)定的,然而后來的業(yè)務改變常常又證明這種看法是錯誤的,然而常常我們的架構已經為之付出了不可挽回的代價。大量事實證明:規(guī)則的變化常常用例變化的根本原因。所以我們的架構要盡可能適應規(guī)則的變化,盡可能建立規(guī)則模版。

每個用例都關系著不同的角色。每一個用例的產生都必然是因為角色的變更(注意:不是替換,而是增強或減弱),所以注意角色的各種可能情況,對架構的設計有舉足輕重的意義。在我們當前的三層架構里,角色完美地對應接口概念。

在一個系統(tǒng)里很多用例都相互關聯,考慮到每個用例均有可能有不同的特例,所以在架構設計中,盡量采用依賴倒置原則。如架構許可可采用消息通信模式(JMS)。這樣可降低耦合度。

現在我們談一下業(yè)務穩(wěn)定存在理由對業(yè)務的影響。存在即是合理,在這里當然是正確的。業(yè)務因人而存在,所以問業(yè)務存在的理由即是問不同角色的需要這項業(yè)務的理由以及喜歡不喜歡當前業(yè)務用例的理由,所有這樣的角色都應該在系統(tǒng)里預留。《待續(xù)》

在架構設計中有幾個原則可以考慮:

用例盡量細分

用例盡量抽象

角色盡量獨立

項測量獨立原則

追求簡單性

這里未提供相關的例子,例子會在以后的更新時提供。

業(yè)務和模式之間的關系

業(yè)務中的一些用例之間的關系常常和一些常規(guī)的模式很相似。但隨著時間的演化,慢慢地和先前的模式有了分歧。這是個正常的現象。但這對系統(tǒng)架構卻要求非常高,要求系統(tǒng)架構能適應一些模式的更替。在這里我們盡可能早地注意到用例之間的相互角色變化,為架構更新做好準備.

java框架有哪些常用框架

十大常用框架:

一、SpringMVC

二、Spring

三、Mybatis

四、Dubbo

五、Maven

六、RabbitMQ

七、Log4j

八、Ehcache

九、Redis

十、Shiro

延展閱讀:

一、SpringMVC

Spring Web MVC是一種基于Java的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架,即使用了MVC架構模式的思想,將web層進行職責解耦,基于請求驅動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發(fā),Spring Web MVC也是要簡化我們日常Web開發(fā)的。

模型(Model )封裝了應用程序的數據和一般他們會組成的POJO。

視圖(View)是負責呈現模型數據和一般它生成的HTML輸出,客戶端的瀏覽器能夠解釋。

控制器(Controller )負責處理用戶的請求,并建立適當的模型,并把它傳遞給視圖渲染。

Spring的web模型 - 視圖 - 控制器(MVC)框架是圍繞著處理所有的HTTP請求和響應的DispatcherServlet的設計。

Spring Web MVC處理請求的流程

具體執(zhí)行步驟如下:

1、 首先用戶發(fā)送請求————前端控制器,前端控制器根據請求信息(如URL)來決定選擇哪一個頁面控制器進行處理并把請求委托給它,即以前的控制器的控制邏輯部分;圖2-1中的1、2步驟;

2、 頁面控制器接收到請求后,進行功能處理,首先需要收集和綁定請求參數到一個對象,這個對象在Spring Web MVC中叫命令對象,并進行驗證,然后將命令對象委托給業(yè)務對象進行處理;處理完畢后返回一個ModelAndView(模型數據和邏輯視圖名);圖2-1中的3、4、5步驟;

3、 前端控制器收回控制權,然后根據返回的邏輯視圖名,選擇相應的視圖進行渲染,并把模型數據傳入以便視圖渲染;圖2-1中的步驟6、7;

4、 前端控制器再次收回控制權,將響應返回給用戶,圖2-1中的步驟8;至此整個結束。

二、Spring

2.1、IOC容器:

IOC容器就是具有依賴注入功能的容器,IOC容器負責實例化、定位、配置應用程序中的對象及建立這些對象間的依賴。應用程序無需直接在代碼中new相關的對象,應用程序由IOC容器進行組裝。在Spring中BeanFactory是IOC容器的實際代表者。

2.2、AOP:

簡單地說,就是將那些與業(yè)務無關,卻為業(yè)務模塊所共同調用的邏輯或責任封裝起來,便于減少系統(tǒng)的重復代碼,降低模塊間的耦合度,并有利于未來的可操作性和可維護性。AOP代表的是一個橫向的關系

AOP用來封裝橫切關注點,具體可以在下面的場景中使用:

Authentication 權限?

Caching 緩存?

Context passing 內容傳遞?

Error handling 錯誤處理?

Lazy loading 懶加載?

Debugging調試?

logging, tracing, profiling and monitoring 記錄跟蹤 優(yōu)化 校準?

Performance optimization 性能優(yōu)化?

Persistence持久化?

Resource pooling 資源池?

Synchronization 同步?

Transactions 事務

三、Mybatis

MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。

總體流程:

(1)加載配置并初始化?

觸發(fā)條件:加載配置文件?

將SQL的配置信息加載成為一個個MappedStatement對象(包括了傳入參數映射配置、執(zhí)行的SQL語句、結果映射配置),存儲在內存中。

(2)接收調用請求?

觸發(fā)條件:調用Mybatis提供的API?

傳入參數:為SQL的ID和傳入參數對象?

處理過程:將請求傳遞給下層的請求處理層進行處理。

(3)處理操作請求 觸發(fā)條件:API接口層傳遞請求過來?

傳入參數:為SQL的ID和傳入參數對象

處理過程:

(A)根據SQL的ID查找對應的MappedStatement對象。

(B)根據傳入參數對象解析MappedStatement對象,得到最終要執(zhí)行的SQL和執(zhí)行傳入參數。

(C)獲取數據庫連接,根據得到的最終SQL語句和執(zhí)行傳入參數到數據庫執(zhí)行,并得到執(zhí)行結果。

(D)根據MappedStatement對象中的結果映射配置對得到的執(zhí)行結果進行轉換處理,并得到最終的處理結果。

(E)釋放連接資源。

(4)返回處理結果將最終的處理結果返回。

MyBatis 最強大的特性之一就是它的動態(tài)語句功能。如果您以前有使用JDBC或者類似框架的經歷,您就會明白把SQL語句條件連接在一起是多么的痛苦,要確保不能忘記空格或者不要在columns列后面省略一個逗號等。動態(tài)語句能夠完全解決掉這些痛苦。

四、Dubbo

Dubbo是一個分布式服務框架,致力于提供高性能和透明化的RPC(遠程過程調用協(xié)議)遠程服務調用方案,以及SOA服務治理方案。簡單的說,dubbo就是個服務框架,如果沒有分布式的需求,其實是不需要用的,只有在分布式的時候,才有dubbo這樣的分布式服務框架的需求,并且本質上是個服務調用的東東,說白了就是個遠程服務調用的分布式框架。

1、透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵入。

2、軟負載均衡及容錯機制,可在內網替代F5等硬件負載均衡器,降低成本,減少單點。

3、 服務自動注冊與發(fā)現,不再需要寫死服務提供方地址,注冊中心基于接口名查詢服務提供者的IP地址,并且能夠平滑添加或刪除服務提供者。

節(jié)點角色說明:?

Provider: 暴露服務的服務提供方。?

Consumer: 調用遠程服務的服務消費方。?

Registry: 服務注冊與發(fā)現的注冊中心。?

Monitor: 統(tǒng)計服務的調用次調和調用時間的監(jiān)控中心。?

Container: 服務運行容器。

五、Maven

Maven這個個項目管理和構建自動化工具,越來越多的開發(fā)人員使用它來管理項目中的jar包。但是對于我們程序員來說,我們最關心的是它的項目構建功能。

六、RabbitMQ

消息隊列一般是在項目中,將一些無需即時返回且耗時的操作提取出來,進行了異步處理,而這種異步處理的方式大大的節(jié)省了服務器的請求響應時間,從而提高了系統(tǒng)的吞吐量。

RabbitMQ是用Erlang實現的一個高并發(fā)高可靠AMQP消息隊列服務器。

Erlang是一門動態(tài)類型的函數式編程語言。對應到Erlang里,每個Actor對應著一個Erlang進程,進程之間通過消息傳遞進行通信。相比共享內存,進程間通過消息傳遞來通信帶來的直接好處就是消除了直接的鎖開銷(不考慮Erlang虛擬機底層實現中的鎖應用)。

AMQP(Advanced Message Queue Protocol)定義了一種消息系統(tǒng)規(guī)范。這個規(guī)范描述了在一個分布式的系統(tǒng)中各個子系統(tǒng)如何通過消息交互。

七、Log4j

日志記錄的優(yōu)先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。

八、Ehcache

EhCache 是一個純Java的進程內緩存框架,具有快速、精干等特點,是Hibernate中默認的CacheProvider。Ehcache是一種廣泛使用的開源Java分布式緩存。主要面向通用緩存,Java EE和輕量級容器。它具有內存和磁盤存儲,緩存加載器,緩存擴展,緩存異常處理程序,一個gzip緩存servlet過濾器,支持REST和SOAP api等特點。

優(yōu)點:?

1、 快速?

2、 簡單?

3、 多種緩存策略?

4、緩存數據有兩級:內存和磁盤,因此無需擔心容量問題?

5、 緩存數據會在虛擬機重啟的過程中寫入磁盤?

6、可以通過RMI、可插入API等方式進行分布式緩存?

7、 具有緩存和緩存管理器的偵聽接口?

8、支持多緩存管理器實例,以及一個實例的多個緩存區(qū)域?

9、提供Hibernate的緩存實現

缺點:?

1、使用磁盤Cache的時候非常占用磁盤空間:這是因為DiskCache的算法簡單,該算法簡單也導致Cache的效率非常高。它只是對元素直接追加存儲。因此搜索元素的時候非常的快。如果使用DiskCache的,在很頻繁的應用中,很快磁盤會滿。

2、 不能保證數據的安全:當突然kill掉java的時候,可能會產生沖突,EhCache的解決方法是如果文件沖突了,則重建cache。這對于Cache數據需要保存的時候可能不利。當然,Cache只是簡單的加速,而不能保證數據的安全。如果想保證數據的存儲安全,可以使用Bekeley DB Java Edition版本。這是個嵌入式數據庫。可以確保存儲安全和空間的利用率。

九、Redis

redis是一個key-value存儲系統(tǒng)。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set –有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區(qū)別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。

Redis數據庫完全在內存中,使用磁盤僅用于持久性。相比許多鍵值數據存儲,Redis擁有一套較為豐富的數據類型。Redis可以將數據復制到任意數量的從服務器。

1.2、Redis優(yōu)點:

(1)異??焖伲篟edis的速度非???,每秒能執(zhí)行約11萬集合,每秒約81000+條記錄。

(2)支持豐富的數據類型:Redis支持最大多數開發(fā)人員已經知道像列表,集合,有序集合,散列數據類型。這使得它非常容易解決各種各樣的問題,因為我們知道哪些問題是可以處理通過它的數據類型更好。

(3)操作都是原子性:所有Redis操作是原子的,這保證了如果兩個客戶端同時訪問的Redis服務器將獲得更新后的值。

(4)多功能實用工具:Redis是一個多實用的工具,可以在多個用例如緩存,消息,隊列使用(Redis原生支持發(fā)布/訂閱),任何短暫的數據,應用程序,如Web應用程序會話,網頁命中計數等。

1.3、Redis缺點:?

(1)單線程?

(2)耗內存

十、Shiro

Apache Shiro是Java的一個安全框架,旨在簡化身份驗證和授權。Shiro在JavaSE和JavaEE項目中都可以使用。它主要用來處理身份認證,授權,企業(yè)會話管理和加密等。Shiro的具體功能點如下:

(1)身份認證/登錄,驗證用戶是不是擁有相應的身份;

(2)授權,即權限驗證,驗證某個已認證的用戶是否擁有某個權限;即判斷用戶是否能做事情,常見的如:驗證某個用戶是否擁有某個角色?;蛘呒毩6鹊尿炞C某個用戶對某個資源是否具有某個權限;

(3)會話管理,即用戶登錄后就是一次會話,在沒有退出之前,它的所有信息都在會話中;會話可以是普通JavaSE環(huán)境的,也可以是如Web環(huán)境的;

(4)加密,保護數據的安全性,如密碼加密存儲到數據庫,而不是明文存儲;

(5)Web支持,可以非常容易的集成到Web環(huán)境;?

Caching:緩存,比如用戶登錄后,其用戶信息、擁有的角色/權限不必每次去查,這樣可以提高效率;

(6)shiro支持多線程應用的并發(fā)驗證,即如在一個線程中開啟另一個線程,能把權限自動傳播過去;

(7)提供測試支持;

(8)允許一個用戶假裝為另一個用戶(如果他們允許)的身份進行訪問;

(9)記住我,這個是非常常見的功能,即一次登錄后,下次再來的話不用登錄了。

java框架有哪些

java框架實在是太多了,網上一抄一大段,根本就了解不到什么。我還是以我的經驗來說一下j2ee的框架。

1.首先力推struts2框架,這是最經典的框架(可以說沒有“之一”)??梢詭湍憧焖俅罱ǔ鲆粋€MVC模型出來。(注:struts1已經很少用了,且問題也很多,強烈推薦使用struts2).

2.Spring框架,這是排行第二的框架(我個人排得,非權威),這個框架出彩的地方就在于它的“依賴注入”和“控制反轉”。簡單的說,就是在程序運行的時候才將參數注入到容器里。

3.持久層框架選Hibernate和Ibatis。 Hibernate自動化能力強,開發(fā)大型應用可以節(jié)約開發(fā)時間,ibatis小巧簡潔,靈活。

4.Jquery是繼prototype之后又一個優(yōu)秀的Javacript框架,封裝了很多javascript方法,是開發(fā)jsp用的框架,目前很流行

一般開發(fā),都是使用Struts2+Spring+Hibernate(ibatis)整合,前端用jquery或者其他類似框架。對于簡單的系統(tǒng),有時用Spring MVC一個框架即可。

Java程序面向對象編程的基本架構 接口的定義和使用 求完整代碼……謝謝

public class Admins implements Userinterface{

private String name;

private String password;

private static int userNum;

public Admins() {

userNum ++;

}

public Admins(String name, String password) {

this.name = name;

this.password = password;

userNum ++;

}

public void setPassword(String password) {

this.password = password;

}

public String getPassword() {

return this.password;

}

public String toString() {

return "Total: " + Admins.userNum + "\nName: " + this.name + "\nPassword: " + this.password;

}

public static void main(String [] args) {

Userinterface [] users = new Userinterface[]{new Admins("jeryy", "11111"), new Admins("green", "123123")};

for(Userinterface u: users) {

System.out.println(u);

}

}

}

interface Userinterface{

public void setPassword(String password);

public String getPassword();

public String toString();

}

public class Bins{

public static void main(String [] args) {

int len = 10;

int [] dist = new int [len];

for(int i = 0; i dist.length; i ++) {

dist[i] = (int)(Math.random() * 100);

}

java.util.Arrays.sort(dist);

System.out.println("生成數組如下: ");

for(int i: dist) {

System.out.print(i + "\t");

}

java.util.Scanner san = new java.util.Scanner(System.in);

System.out.print("輸入要查找的數: ");

int key = san.nextInt();

int res = Bins.binSearch(dist, key);

//System.out.println(res);

String info = (res =0 ) ? (key + ":" + res) : "查找失敗";

System.out.println(info);

}

public static int binSearch(int [] dist, int key) {

java.util.Arrays.sort(dist);

return java.util.Arrays.binarySearch(dist, key);

}

}

新聞標題:java常用代碼架構示例 java經典代碼
鏈接分享:http://muchs.cn/article22/dospcjc.html

成都網站建設公司_創(chuàng)新互聯,為您提供網站制作、手機網站建設、用戶體驗、關鍵詞優(yōu)化、網站建設、標簽優(yōu)化

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都app開發(fā)公司