少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          #

          AOP

          面向切面編程(AOP)通過提供另外一種思考程序結構的途經來彌補面向對象編程(OOP)的不足。在OOP中模塊化的關鍵單元是類(classes),而在AOP中模塊化的單元則是切面。切面能對關注點進行模塊化,例如橫切多個類型和對象的事務管理。(在AOP術語中通常稱作橫切(crosscutting)關注點。)

          AOP框架是Spring的一個重要組成部分。但是Spring IoC容器并不依賴于AOP,這意味著你有權利選擇是否使用AOP,AOP做為Spring IoC容器的一個補充,使它成為一個強大的中間件解決方案。

          AOP即Aspect-Oriented Programming的縮寫,中文意思是面向切面(或方面)編程。AOP實際上是一種編程思想,可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種思想。

          AOP在Spring Framework中的作用

          • 提供聲明式企業服務,特別是為了替代EJB聲明式服務。最重要的服務是聲明性事務管理

          • 允許用戶實現自定義切面,用AOP來完善OOP的使用。

          目前AOP主要有:Spring AOP ,JBOSS AOP ,AspectJ AOP

          AOP與OOP:可以理解為OOP是縱向的采用繼承樹形式的。而AOP是橫向的

          Spring AOP:

          由于Spring AOP是容易實現的,如果你計劃在Spring Beans之上將橫切關注點模塊化,Spring的這一目標將是要點之一。但同樣的目標也可能成為一個限制,如果你用的是普通的Java對象而不是Spring beans,并基于此將橫切關注點模塊化的話。另一方面,AspectJ可用于基于普通Java對象的模塊化,但在實施之前需要良好的關于這個主題的知識。
           
          Spring AOP致力于提供一種能夠與Spring IoC緊密集成的面向方面框架的實現,以便于解決在開發企業級項目時面臨的常見問題。明確你在應用橫切關注點(cross-cutting concern)時(例如事物管理、日志或性能評估),需要處理的是Spring beans還是POJO。如果正在開發新的應用,則選擇Spring AOP就沒有什么阻力。但是如果你正在維護一個現有的應用(該應用并沒有使用Spring框架),AspectJ就將是一個自然的選擇了。為了詳細說明這一點,假如你正在使用Spring AOP,當你想將日志功能作為一個通知(advice)加入到你的應用中,用于追蹤程序流程,那么該通知(Advice)就只能應用在Spring beans的連接點(Joinpoint)之上。
           

          AspectJ AOP:

          使用“AspectJ”你可以在任何Java對象上應用通知,而不需要在任何文件中創建或配置任何bean。
           

          另一個需要考慮的因素是,你是希望在編譯期間進行織入(weaving),還是編譯后(post-compile)或是運行時(run-time)。Spring只支持運行時織入。如果你有多個團隊分別開發多個使用Spring編寫的模塊(導致生成多個jar文件,例如每個模塊一個jar文件),并且其中一個團隊想要在整個項目中的所有Spring bean(例如,包括已經被其他團隊打包了的jar文件)上應用日志通知(在這里日志只是用于加入橫切關注點的舉例),那么通過配置該團隊自己的Spring配置文件就可以輕松做到這一點。之所以可以這樣做,就是因為Spring使用的是運行時織入。

           因為Spring基于代理模式(使用CGLIB),它有一個使用限制,即無法在使用final修飾的bean上應用橫切關注點。因為代理需要對Java類進行繼承,一旦使用了關鍵字final,這將是無法做到的。

          在這種情況下,你也許會考慮使用AspectJ,其支持編譯期織入且不需要生成代理。


          于此相似,在static和final方法上應用橫切關注點也是無法做到的。因為Spring基于代理模式。如果你在這些方法上配置通知,將導致運行時異常,因為static和final方法是不能被覆蓋的。在這種情況下,你也會考慮使用AspectJ,因為其支持編譯期織入且不需要生成代理。
           
          缺點:
          使用AspectJ的一個間接局限是,因為AspectJ通知可以應用于POJO之上,它有可能將通知應用于一個已配置的通知之上。對于一個你沒有注意到這方面問題的大范圍應用的通知,這有可能導致一個無限循環。
           

          面向切面編程,把散落在程序中的公共部分提取出來,做成切面類,這樣的好處在于,代碼的可重用,一旦涉及到該功能的需求發生變化,只要修改該代碼就行,否則,你要到處修改,如果只要修改1、2處那還可以接受,萬一有1000處呢。 
          AOP底層的東西就是JDK動態代理和CGLIB代理,說白了就是增強類的功能。 
          最常用的AOP應用在數據庫連接以及事務處理上。

          AOP:面向切面編程。(Aspect-Oriented Programming)
          AOP可以說是對OOP的補充和完善。OOP引入封裝、繼承和多態性等概念來建立一種對象層次結構,用以模擬公共行為的一個集合。當我們需要為分散的對象引入公共行為的時候,OOP則顯得無能為力。也就是說,OOP允許你定義從上到下的關系,但并不適合定義從左到右的關系。例如日志功能。日志代碼往往水平地散布在所有對象層次中,而與它所散布到的對象的核心功能毫無關系。在OOP設計中,它導致了大量代碼的重復,而不利于各個模塊的重用。
          將程序中的交叉業務邏輯(比如安全,日志,事務等),封裝成一個切面,然后注入到目標對象(具體業務邏輯)中去。

          實現AOP的技術,主要分為兩大類:一是采用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行為的執行;二是采用靜態織入的方式,引入特定的語法創建“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼.

           AOP(Aspect Orient Programming),作為面向對象編程的一種補充,廣泛應用于處理一些具有橫切性質的系統級服務,如事務管理、安全檢查、緩存、對象池管理等。 AOP 實現的關鍵就在于 AOP 框架自動創建的 AOP 代理,AOP 代理則可分為靜態代理和動態代理兩大類,其中靜態代理是指使用 AOP 框架提供的命令進行編譯,從而在編譯階段就可生成 AOP 代理類,因此也稱為編譯時增強;而動態代理則在運行時借助于 JDK 動態代理、CGLIB 等在內存中"臨時"生成 AOP 動態代理類,因此也被稱為運行時增強。









          posted @ 2015-04-20 02:07 abin 閱讀(436) | 評論 (0)編輯 收藏

          先建立表:
          CREATE TABLE `student` (                                  
                     `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',      
                     `name` varchar(100) DEFAULT NULL COMMENT 'name',        
                     `ban` varchar(100) DEFAULT NULL COMMENT 'ban',          
                     `score` int(11) DEFAULT NULL,                           
                     PRIMARY KEY (`id`),                                     
                     KEY `inx_ban` (`ban`)                                   
                   ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1  

          name:學生名
          ban:班級
          score:分數
          1、按班級分組排序,取出分數前兩名的同學。
          select t.ban,t.score,t.name from student t where 2<(select count(*) from student k where k.ban=t.ban and t.score>k.score order by k.ban desc) order by t.ban,t.score desc;
          示例如下:
          one 100 abin1
          one 99 abin2
          three 100 varyall1
          three 99 varyall2
          two 100 lee1
          two 99 lee2
          2、按組統計出來每組的所有分組,用逗號隔開
          select t.ban,group_concat(t.score) from student t group by t.ban
          示例如下:
          one 100,99,97,95,91
          three 100,99,97,95,91
          two 100,99,97,95,91



          posted @ 2015-04-17 01:29 abin 閱讀(389) | 評論 (0)編輯 收藏

          Spring控制反轉(IoC)的理解

          Spring框架的核心就是控制反轉(Inversion of Control)和依賴注入(Dependency Injection),通過這兩方面來實現松耦合。

          使用IoC,對象是被動的接受依賴類,而不是自己主動的去找。容器在實例化的時候主動將它的依賴類注入給它。可以這樣理解:控制反轉將類的主動權轉移到接口上,依賴注入通過xml配置文件在類實例化時將其依賴類注入。

              依賴類(Dependency)是通過外部(xml)來注入的,而不是由使用它的類(Business)來自己制造,這就是依賴的注入。另一方面,Business對類Dependency的依賴轉移到對接口IDependency的依賴,控制權由類轉移到了接口,即由"實現"轉移到"抽象"中。這就是控制反轉。
           
          使用IoC,對象是被動的接受依賴類,而不是自己主動的去找。容器在實例化的時候主動將它的依賴類注入給它。可以這樣理解:控制反轉將類的主動權轉移到接口上,依賴注入通過xml配置文件在類實例化時將其依賴類注入。

          控制反轉即IoC (Inversion of Control),它把傳統上由程序代碼直接操控的對象的調用權交給容器,通過容器來實現對象組件的裝配和管理。所謂的“控制反轉”概念就是對組件對象控制權的轉移,從程序代碼本身轉移到了外部容器。

          依賴注入(Dependency Injection)和控制反轉(Inversion of Control)是同一個概念。具體含義是:當某個角色(可能是一個Java實例,調用者)需要另一個角色(另一個Java實例,被調用者)的協助時,在傳統的程序設計過程中,通常由調用者來創建被調用者的實例。但在Spring里,創建被調用者的工作不再由調用者來完成,因此稱為控制反轉;創建被調用者實例的工作通常由Spring容器來完成,然后注入調用者,因此也稱為依賴注入。
            簡而言之:所謂控制反轉就是應用本身不負責依賴對象的創建及維護,依賴對象的創建及維護是由外部容器負責的。這樣控制權就由應用轉移到了外部容器,控制權的轉移就是所謂反轉;所謂依賴注入就是指:在運行期,由外部容器動態地將依賴對象注入到組件中。


          傳統編程和IoC的對比
          傳統編程:決定使用哪個具體的實現類的控制權在調用類本身,在編譯階段就確定了。
          IoC模式:調用類只依賴接口,而不依賴具體的實現類,減少了耦合。控制權交給了容器,在運行的時候才由容器決定將具體的實現動態的“注入”到調用類的對象中。


          應用控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。所以,控制反轉是,關于一個對象如何獲取他所依賴的對象的引用,這個責任的反轉。


          IoC核心理念:

          1.在類當中不創建對象,在代碼中不直接與對象和服務連接

          2.在配置文件中描述創建對象的方式,以及各個組件之間的聯系

          3.外部容器通過解析配置文件,通過反射來將這些聯系在一起

           

          The Hollywood principle:Don’t call us,we’ll call you.

          即,所有組件都是被動的、不主動聯系(調用)外部代碼,

          要等著外部代碼的調用--------所有的組件的初始化和相互調用都由容器負責實現。

          簡單的說,就是整個程序之間的關系,都由容器來控制:將程序的控制權反轉給容器,就是所謂的外轉

          而在我們傳統代碼中,由程序代碼直接控制


          優缺點:
          IoC最大的好處是什么?
              因為把對象生成放在了XML里定義,所以當我們需要換一個實現子類將會變成很簡單(一般這樣的對象都是實現于某種接口的),只要修改XML就可以了,這樣我們甚至可以實現對象的熱插拔(有點象USB接口和SCSI硬盤了)。
          IoC最大的缺點是什么?
              (1)生成一個對象的步驟變復雜了(事實上操作上還是挺簡單的),對于不習慣這種方式的人,會覺得有些別扭和不直觀。
              (2)對象生成因為是使用反射編程,在效率上有些損耗。但相對于IoC提高的維護性和靈活性來說,這點損耗是微不足道的,除非某對象的生成對效率要求特別高。
              (3)缺少IDE重構操作的支持,如果在Eclipse要對類改名,那么你還需要去XML文件里手工去改了,這似乎是所有XML方式的缺憾所在。


            IOC的意思是控件反轉也就是由容器控制程序之間的關系,把控件權交給了外部容器,之前的寫法,由程序代碼直接操控,而現在控制權由應用代碼中轉到了外部容器,控制權的轉移是所謂反轉






          posted @ 2015-04-15 13:36 abin 閱讀(464) | 評論 (0)編輯 收藏

           下載一個dubbo.xsd文件
          windows->preferrence->xml->xmlcatalog 

          add->catalog entry  ->file system 選擇剛剛下載的文件路徑

          修改key值和配置文件的http://code.alibabatech.com/schema/dubbo/dubbo.xsd 相同

          保存。。在xml文件右鍵validate  ok解決了。

          http://my.oschina.net/u/1455908/blog/343437
          posted @ 2015-04-14 11:13 abin 閱讀(353) | 評論 (0)編輯 收藏

          初級優化:
          1、select這些關鍵字大寫,否則,系統會自動的轉化為大寫才去執行sql的解釋執行計劃。
          2、如果需要字段少的話選擇select a,b,c from table ,盡量少用select * from table.
          3、盡量少使用!=和<>因為不會使用到索引。
          4、盡量少使用or,不會使用到索引.
          5、避免使用is not null 和not in,like,不會使用到索引。
          6、避免全表掃描,在where和order by 上面建立索引。
          7、應盡量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:
          select id from t where num/2=100
          應改為:
          select id from t where num=100*2
          8、應盡量避免在where子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。
          9、不要在 where 子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。





















          posted @ 2015-04-08 21:33 abin 閱讀(397) | 評論 (0)編輯 收藏

          二叉樹->b-樹,解決的是讀索引的IO次數問題

          在真實的數據庫中
          往往索引本身的數據量也是非常龐大的
          樹的查找,其實是每一層需要做一次判斷
          因為索引很大,只能存在文件里,不能一次加載,所以沒判斷一層,都需要有一次磁盤IO,所以查找IO次數最壞的情況
          就是樹的高度-1,加入你要的節點在最后一層的話
          二叉樹,是只有兩個子節點的
          一單數據量一大的話
          樹高會很恐怖
          B-Tree,的度是沒有限制的
          可以打打減少這個數的高度,從而減少磁盤讀的次數


          b-tree -> b+tree :這個是針對IO的再次優化
          b+tree,的父節點是不存數據的
           數據庫索引,其實一個節點剛好占的是硬盤的一頁空間
           由于索引節點不存數據
           一個硬盤頁,也就是一個節點的度就可以更大
           可以最大程度減少樹的高度
           之所以一個節點剛好占一頁,也是IO的問題,一次硬盤IO只能讀一頁
           這是結構上的改進
           效果就是一個節點一次IO的度更大了
           他這個意思就是說,如果有索引,一次索引查找,基本不會超過2次硬盤IO
           這還只是b-tree
           b-tree這玩意兒就讀B樹
           很多人讀B減數是誤讀
























          posted @ 2015-04-07 22:39 abin 閱讀(419) | 評論 (0)編輯 收藏

          1、JVM類裝載機制,JVM內存模型,JVM垃圾回收算法,JVM垃圾回收器。
          2、spring IOC和AOP機制。
          3、http的get,post,put,delete,option。
          4、Mybatis復雜數據類型實現,自增id返回機制。
          5、多線程的ThreadLocal實現機制,volatile,線程池使用。
          6、memcached的分片存儲機制,redis優化。
          7、mysql的myisam和innodb的區別,索引的概念和優化,mysql的主鍵索引和普通索引的區別,以及唯一索引。
           主鍵的數據域存儲了整行的數據, 普通索引的數據域存的是主鍵
           聯合索引這個,A=X AND C=X能用到的索引長度是A列的長度
          A=X And B=X用到的索引長度是兩列的長度和 
          8、sql查詢實現,以及優化sql。
          9、數據庫連接池異常怎么處理。















          posted @ 2015-04-07 18:53 abin 閱讀(328) | 評論 (0)編輯 收藏

          服務端編程的性能殺手:
          1、大量線程導致的線程切換開銷。
          2、鎖和競爭條件。
          3、非必要的內存拷貝。
          4、網絡IO
          5、磁盤IO
          6、CPU核心數
          7、網絡帶寬
          8、內存大小
          9、
          posted @ 2015-04-05 05:46 abin 閱讀(360) | 評論 (0)編輯 收藏

          1、線程問題
              由于Redis只使用單核,而Memcached可以使用多核,所以平均每一個核上Redis在存儲小數據時比Memcached性能更高。而在100k以上的數據中,Memcached性能要高于Redis,雖然Redis最近也在存儲大數據的性能上進行優化,但是比起 Memcached,還是稍有遜色。

          因為 Redis 的操作都非常快速——它的數據全部在內存里,完全不需要訪問磁盤。至于并發,Redis 使用多路 I/O 復用技術,本身的并發效率不成問題。

          當然,單個 Redis 進程沒辦法使用多核(任一時刻只能跑在一個 CPU 核心上),但是它本來就不是非常計算密集型的服務。如果單核性能不夠用,可以多開幾個進程。

          Redis 單線程-多路復用io模型

          2、內存使用效率對比:
              使用簡單的key-value存儲的話,Memcached的內存利用率更高,而如果Redis采用hash結構來做key-value存儲,由于其組合式的壓縮,其內存利用率會高于Memcached。
          3、數據類型:
              Redis相比Memcached來說,擁有更多的數據結構和并支持更豐富的數據操作,通常在Memcached 里,你需要將數據拿到客戶端來進行類似的修改再set回去。這大大增加了網絡IO的次數和數據體積。在Redis中,這些復雜的操作通常和一般的 GET/SET一樣高效。所以,如果需要緩存能夠支持更復雜的結構和操作,那么Redis會是不錯的選擇。
          4、安全機制
              memcached采用cas機制,而redis有事務機制。
          5、事件模型
              memcached采用了libevent事件模型,多線程模型可以發揮多核作用,Redis實現了自己的一套和libevent類似的事件驅動機制,兩者都采用了epoll通信模型和非阻塞機制。

              epoll是在2.6內核中提出的,是之前的select和poll的增強版本。相對于select和poll來說,epoll更加靈活,沒有描述符限制。epoll使用一個文件描述符管理多個描述符,將用戶關系的文件描述符的事件存放到內核的一個事件表中,這樣在用戶空間和內核空間的copy只需一次。

           最后講講 為什么epoll會比select高效,主要從三方面來進行論述。
                  (1)elect對描述符狀態的改變是通過輪詢來進行查找的;而epoll是當描述符狀態發生改變時主動進行通知內核,這就是所謂的Reactor事件處理機制。可以用“好萊塢原則”進行描述:不要打電話給我們,我們會打電話通知你。相比之下,select的機制就好比面試結束后不停給面試官打電話詢問面試結果。效率孰高孰低,可見一 斑。
                  
                 (2)select的文件描述符是使用鏈表進行組織的;而epoll是使用紅黑樹這一高效數據結構組織的。
                  
                 (3)select從內核到用戶空間傳遞文件描述符上發送的信息是使用內存復制的方式進行的;而epoll是采用共享內存的方式。  
          6、內存管理方面
            Memcached使用預分配的內存池的方式,使用slab和大小不同的chunk來管理內存,Item根據大小選擇合適的chunk存儲,內存池的方式可以省去申請/釋放內存的開銷,并且能減小內存碎片產生,但這種方式也會帶來一定程度上的空間浪費,并且在內存仍然有很大空間時,新的數據也可能會被剔除,原因可以參考Timyang的文章:http://timyang.net/data/Memcached-lru-evictions/
            Redis使用現場申請內存的方式來存儲數據,并且很少使用free-list等方式來優化內存分配,會在一定程度上存在內存碎片,Redis跟據存儲命令參數,會把帶過期時間的數據單獨存放在一起,并把它們稱為臨時數據,非臨時數據是永遠不會被剔除的,即便物理內存不夠,導致swap也不會剔除任何非臨時數據(但會嘗試剔除部分臨時數據),這點上Redis更適合作為存儲而不是cache。
          7、redis并發

          Redis 是一個高性能的key-value數據庫。 redis的出現,很大程度補償了memcached這類keyvalue存儲的不足,在部 分場合可以對關系數據庫起到很好的補充作用。它提供了Python,Ruby,Erlang,PHP客戶端,使用很方便。

          性能測試結果:

          SET操作每秒鐘 110000 次,GET操作每秒鐘 81000 次,服務器配置如下:

          Linux 2.6, Xeon X3320 2.5Ghz.

          stackoverflow 網站使用 Redis 做為緩存服務器。





          posted @ 2015-04-05 05:45 abin 閱讀(570) | 評論 (0)編輯 收藏

          中央倉庫(官方和非官方)

          https://repo1.maven.org/maven2
          http://repo.maven.apache.org/maven2/
          http://maven.oschina.net/content/groups/public/
          http://download.java.net/maven/2/
          https://repository.jboss.com/nexus/content/repositories/root_repository/maven2/
          http://repository.jboss.com/maven2/
          http://mirrors.ibiblio.org/maven2/
          http://repository.sonatype.org/content/groups/public/

          私有倉庫
          http://repository.codehaus.org/
          http://snapshots.repository.codehaus.org/
          http://people.apache.org/repo/m2-snapshot-repository/
          http://people.apache.org/repo/m2-incubating-repository/
          posted @ 2015-04-03 22:27 abin 閱讀(412) | 評論 (0)編輯 收藏

          僅列出標題
          共50頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 苍梧县| 牡丹江市| 朝阳县| 琼结县| 资溪县| 凤阳县| 兰州市| 灵丘县| 丹寨县| 邵东县| 黄冈市| 定州市| 西贡区| 鄂尔多斯市| 巴塘县| 太仆寺旗| 斗六市| 义马市| 道孚县| 绥化市| 江孜县| 中山市| 宁明县| 安乡县| 漠河县| 宜兰县| 北碚区| 启东市| 通州市| 大竹县| 柘城县| 金乡县| 林甸县| 唐山市| 嵩明县| 兰西县| 临猗县| 四平市| 天等县| 岐山县| 三明市|